https://www.acmicpc.net/problem/3055
3055번: 탈출
사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제
www.acmicpc.net
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int[] dr = { -1, 1, 0, 0 };
static int[] dc = { 0, 0, -1, 1 };
static int R, C, answer;
static boolean isDone = false;
static char[][] map;
static Queue<int[]> hedgehogList = new LinkedList<>();
static Queue<int[]> waterList = new LinkedList<>();
static boolean[][] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
map = new char[R][C];
visited = new boolean[R][C];
for (int r = 0; r < R; r++) {
String str = br.readLine();
for (int c = 0; c < C; c++) {
map[r][c] = str.charAt(c);
if (map[r][c] == 'S') {
hedgehogList.offer(new int[] { r, c });
} else if (map[r][c] == '*') {
waterList.offer(new int[] { r, c });
}
}
}
while (!isDone) {
flowWater(waterList.size());
runHedgehog(hedgehogList.size());
answer++;
}
}
private static void flowWater(int size) {
while (size-- > 0) {
int[] curr = waterList.poll();
int r = curr[0];
int c = curr[1];
for (int dir = 0; dir < 4; dir++) {
int nr = r + dr[dir];
int nc = c + dc[dir];
if (!isRange(nr, nc) || map[nr][nc] == 'X' || map[nr][nc] == 'D' || map[nr][nc] == '*') {
continue;
}
map[nr][nc] = '*';
waterList.offer(new int[] { nr, nc });
}
}
}
private static void runHedgehog(int size) {
if (size == 0) {
System.out.println("KAKTUS");
isDone = true;
return;
}
while (size-- > 0) {
int[] curr = hedgehogList.poll();
int r = curr[0];
int c = curr[1];
if (map[r][c] == 'D') {
System.out.println(answer);
isDone = true;
return;
}
for (int dir = 0; dir < 4; dir++) {
int nr = r + dr[dir];
int nc = c + dc[dir];
if (!isRange(nr, nc) || map[nr][nc] == 'X' || map[nr][nc] == '*' || visited[nr][nc]) {
continue;
}
visited[nr][nc] = true;
hedgehogList.offer(new int[] { nr, nc });
}
}
}
private static boolean isRange(int r, int c) {
return r >= 0 && r < R && c >= 0 && c < C;
}
}
'Baekjoon Online Judge > Java' 카테고리의 다른 글
[Baekjoon Online Judge] 1194 - 달이 차오른다, 가자. / Java (0) | 2021.09.29 |
---|---|
[Baekjoon Online Judge] 4485 - 녹색 옷 입은 애가 젤다지? / Java (0) | 2021.09.29 |
[Baekjoon Online Judge] 11581 - 구호물자 / Java (0) | 2021.09.25 |
[Baekjoon Online Judge] 7576 - 토마토 / Java (0) | 2021.09.23 |
[Baekjoon Online Judge] 2210 - 숫자판 점프 / Java (0) | 2021.09.20 |