탈출


백준 3005: 탈출

문제보기
Alt text

풀이

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");

	}
}