문제 : www.acmicpc.net/problem/5427
5427번: 불
상근이는 빈 공간과 벽으로 이루어진 건물에 갇혀있다. 건물의 일부에는 불이 났고, 상근이는 출구를 향해 뛰고 있다. 매 초마다, 불은 동서남북 방향으로 인접한 빈 공간으로 퍼져나간다. 벽에
www.acmicpc.net
문제 유형 : BFS
풀이 방식 : BFS형식으로 Queue 사이즈 만큼(한 턴)만 퍼지는 방식으로
1. 불퍼지고
2. 상근이 이동
상근이가 이동하지 못하는 턴일때 -> IMPOSSIBLE
상근이가 빠져나왔을때 -> time 출력
소스코드
package BOJ;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class BOJ_5427_불_Main {
private static int[] dr;
private static int[] dc;
private static int w;
private static int h;
private static Queue<int[]> user;
private static Queue<int[]> fire;
private static char[][] map;
private static boolean isBreak;
private static boolean user_status;
private static boolean[][] user_visited;
private static boolean[][] fire_visited;
public static void main(String[] args) throws NumberFormatException, IOException {
// 1. 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
dr = new int[] { -1, 1, 0, 0 };
dc = new int[] { 0, 0, -1, 1 };
for (int tc = 0; tc < T; tc++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
w = Integer.parseInt(st.nextToken());
h = Integer.parseInt(st.nextToken());
map = new char[h][w];
user = new LinkedList<int[]>();
fire = new LinkedList<int[]>();
user_visited = new boolean[h][w];
fire_visited = new boolean[h][w];
for (int i = 0; i < h; i++) {
String str = br.readLine();
for (int j = 0; j < w; j++) {
map[i][j] = str.charAt(j);
if (map[i][j] == '@') {
user.add(new int[] { i, j });
user_visited[i][j] = true;
map[i][j] = '.';
} else if (map[i][j] == '*') {
fire_visited[i][j] = true;
fire.add(new int[] { i, j });
}
}
}
// 2. 구현
// '.': 빈 공간, '#': 벽, '@': 상근이의 시작 위치, '*': 불
int time = 0;
isBreak = false; // (T:탈출, F:탈출못함)
user_status = false; // 상근이 상태(T:움직임, F:못움직임)
while (true) {
time++;
user_status = false;
move(fire, '*');
move(user, '@');
if (!user_status) break;
if (isBreak) break;
}
if(isBreak) {
System.out.println(time);
} else if(!user_status) System.out.println("IMPOSSIBLE");
}
}
private static void move(Queue<int[]> q, char wh) {
int size = q.size();
for (int i = 0; i < size; i++) {
int[] cur = q.poll();
int r = cur[0];
int c = cur[1];
for (int d = 0; d < 4; d++) {
int nr = dr[d] + r;
int nc = dc[d] + c;
if (nr > -1 && nc > -1 && nr < h && nc < w) {
if (wh == '@') { // 상근이일때
if (!user_visited[nr][nc]&&map[nr][nc] == '.') {
user_visited[nr][nc] = true;
user_status = true;
user.add(new int[] { nr, nc });
}
} else { // 불일때
if (!fire_visited[nr][nc]&&map[nr][nc] != '#') {
fire_visited[nr][nc] = true;
map[nr][nc] = '*';
fire.add(new int[] { nr, nc });
}
}
} else {
if (wh == '@') {
isBreak = true;
break;
}
}
}
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[JAVA]백준_5014_스타트링크 (0) | 2021.01.28 |
---|---|
[JAVA]백준_2589_보물섬 (0) | 2021.01.28 |
[JAVA]백준_1260_DFS와BFS (0) | 2021.01.24 |
[JAVA]백준_13335_트럭 (0) | 2021.01.20 |
[JAVA]백준_10819_차이를최대로 (0) | 2021.01.19 |