알고리즘
[백준, 자바, 14940번] 쉬운 최단거리
hminor
2024. 11. 1. 17:22
반응형
풀이
- 처음엔 그냥 단순히 bfs로 풀었는데
- 제출후 틀렸다고 해서, 출력에 보니
- 갈 수 없는 구간은 -1로 하라고 해서 다시 아래와 같이
- 초기 result 값을 모두 -1로 정의 후
- 값을 추가할 때 조건 분기처리를 더하여 해결.
import java.io.*;
import java.util.*;
public class _14940 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Deque<List<Integer>> dq = new ArrayDeque<>();
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[][] map = new int[N][M];
int[][] result = new int[N][M];
for (int i=0; i<N; i++) Arrays.fill(result[i],-1);
for (int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
for (int j=0; j<M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
if (map[i][j]==2) {
dq.add(new ArrayList<>(Arrays.asList(i,j)));
result[i][j] = 0;
} else if (map[i][j]==0) result[i][j] = 0;
}
}
int[] ni = {-1,0,1,0};
int[] nj = {0,1,0,-1};
while (!dq.isEmpty()) {
List<Integer> now = dq.pollFirst();
for (int i=0; i<4; i++) {
int di = ni[i]+now.get(0);
int dj = nj[i]+now.get(1);
if ((0<=di&&di<N) && (0<=dj&&dj<M) && map[di][dj]==1 && result[di][dj]==-1) {
result[di][dj] = result[now.get(0)][now.get(1)]+1;
dq.add(new ArrayList<>(Arrays.asList(di,dj)));
}
}
}
StringBuilder sb = new StringBuilder("");
for (int[] li: result) {
for (int num: li) sb.append(num+" ");
sb.append("\n");
}
System.out.println(sb);
}
}