탈출
백준 3005: 탈출
풀이
1분에 물이 먼저 확장하고 고슴도치가 사방으로 한 칸씩 이동함을 주의
소스코드
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
public static class Node {
int r, c, cnt;
Node(int r, int c, int cnt) {
this.r = r;
this.c = c;
this.cnt = cnt;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int R = sc.nextInt();
int C = sc.nextInt();
char[][] map = new char[R][C];
boolean[][] visit = new boolean[R][C];
Queue<Node> queue = new LinkedList<>();
int[] dr = { -1, 1, 0, 0 };
int[] dc = { 0, 0, -1, 1 };
int Finish_R = 0;
int Finish_C = 0;
boolean flag = false;
int min = Integer.MAX_VALUE;
for (int i = 0; i < R; i++) {
String str = sc.next();
for (int j = 0; j < C; j++) {
map[i][j] = str.charAt(j);
if (map[i][j] == 'S') {
queue.add(new Node(i, j, 0));
visit[i][j] = true;
map[i][j] = '.';
}
if(map[i][j]=='D') {
Finish_R = i;
Finish_C = j;
}
}
}
while (!queue.isEmpty()) {
// 물부터 확장
Queue<Node> water = new LinkedList<>();
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (map[i][j] == '*') {
water.add(new Node(i, j, 0));
}
}
}
while (!water.isEmpty()) {
Node w = water.poll();
for (int d = 0; d < 4; d++) {
int nr = w.r + dr[d];
int nc = w.c + dc[d];
if (nr >= 0 && nc >= 0 && nr < R && nc < C && map[nr][nc] == '.') {
map[nr][nc] = '*';
}
}
}
// 고슴도치 이동
int n = queue.size();
while (n > 0) {
Node node = queue.poll();
if(node.r==Finish_R && node.c == Finish_C) { //비버의 굴 도착
flag = true;
if(node.cnt<min)
min = node.cnt;
}
for (int d = 0; d < 4; d++) {
int nr = node.r + dr[d];
int nc = node.c + dc[d];
if (nr >= 0 && nc >= 0 && nr < R && nc < C && !visit[nr][nc]) {
if (map[nr][nc] == '.' || map[nr][nc] == 'D') {
visit[nr][nc] = true;
queue.add(new Node(nr, nc, node.cnt + 1));
}
}
}
n--;
}
}
if(flag)
System.out.println(min);
else
System.out.println("KAKTUS");
}
}