풀이
- 처음엔 그냥 단순히 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);
}
}
'알고리즘' 카테고리의 다른 글
[백준, 자바, 1057번] 토너먼트 (1) | 2024.11.09 |
---|---|
[백준, 자바, 1541번] 잃어버린 괄호 (0) | 2024.11.08 |
[백준, 자바, 12852번] 1로 만들기 2 (0) | 2024.11.01 |
[백준, 자바, 18352번] 특정 거리의 도시 찾기 (0) | 2024.11.01 |
[백준, 자바, 7569번] 토마토 (1) | 2024.10.31 |