16946번: 벽 부수고 이동하기 4
N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 한 칸에서 다른 칸으로 이동하려면, 두 칸이 인접해야 한다. 두 칸이
www.acmicpc.net
package 백준.자바.벽부수고이동하기4_16946;
import java.io.*;
import java.util.*;
public class Main {
private boolean[][] visited;
private int N, M, indexNum;
private int[][] map;
private int[][] emptyCount;
private int[] spaceCount;
private int count;
private int[] dx = {0, 0, -1, 1};
private int[] dy = {1, -1, 0, 0};
private void dfs(int x, int y){
visited[x][y] = true;
count++;
emptyCount[x][y] = indexNum;
for(int i = 0; i < 4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx < 0 || ny < 0 || nx >= N || ny >= M ) continue;
if(visited[nx][ny] || map[nx][ny] == 1) continue;
dfs(nx, ny);
}
}
public void solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new int[N][M];
emptyCount = new int[N][M];
visited = new boolean[N][M];
spaceCount = new int[N * M+1];
for (int i = 0; i < N; i++) {
String s = br.readLine();
for (int j = 0; j < M; j++) {
map[i][j] = s.charAt(j) - '0';
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (map[i][j] == 0 && !visited[i][j]) {
indexNum++;
count = 0;
dfs(i, j);
spaceCount[indexNum] = count;
}
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (map[i][j] == 1) {
int[] lst = new int[4];
int sum = 0;
boolean flag = false;
for (int k = 0; k < 4; k++) {
int nx = i + dx[k];
int ny = j + dy[k];
if (nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
if(map[nx][ny] == 1) continue;
for (int q = 0; q < k; q++) {
if (lst[q] == emptyCount[nx][ny]) {
flag = true;
break;
}
}
if (flag) {
flag = false;
continue;
}
lst[k] = emptyCount[nx][ny];
sum += spaceCount[emptyCount[nx][ny]];
}
sb.append((sum + 1) % 10);
} else sb.append(0);
}
sb.append('\n');
}
System.out.println(sb);
}
public static void main(String[] args) throws Exception{
new Main().solution();
}
}
'문제풀이 > 백준' 카테고리의 다른 글
서강그라운드 14938 Java (0) | 2024.01.29 |
---|---|
2048(Easy) 12100 Java (0) | 2024.01.29 |
행성 터널 2887 Java (1) | 2024.01.28 |
문제집 1766 Java (0) | 2024.01.28 |
카드 구매하기 11052 Java (0) | 2024.01.27 |