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;
	}
}

+ Recent posts