Home G4179. 불!
Post
Cancel

G4179. 불!

문제

image


제출 코드

image


  • 사용 알고리즘 : BFS, 그래프


지훈이와 불을 매 회차마다 사방탐색으로 이동할 수 있는 위치를 각각의 queue에 담아 BFS로 탐색하였다.

먼저 지훈이를 사방에서 이동할수 있는 부분을 대기열에 추가하고, 가장자리 부분을 만나면 탈출한다.

다음으로 불의 사방에서 벽과 불이 있는 곳을 제외한 곳은 대기열에 추가한다.

방문체크를 기존 배열에 해주었는데, 불의 방문체크만 하고 지훈이의 방문체크를 하지 않아 메모리 초과가 났었다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package gold;

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 G4179_fire {
static int R, C;
static char[][] map;
static int[] di = {-1, 0, 1, 0};
static int[] dj = {0, 1, 0, -1};
static Queue<Point> jihun = new LinkedList<Point>();
static Queue<Point> fire = new LinkedList<Point>();
static class Point{
int i, j;
Point(int i, int j){
this.i = i;
this.j = j;
}
}
static String exit() {
int time = 0;
while(!jihun.isEmpty()) {
time++;
int size = jihun.size();
// 1. 지훈 대피
for(int s=0; s<size; s++) {
Point p = jihun.poll();
if(map[p.i][p.j]=='F') continue; // 이미 불에 휩싸여버린 지훈
for(int d=0; d<4; d++) {
int ni = p.i + di[d];
int nj = p.j + dj[d];
if(ni<0 || ni>=R || nj<0 || nj>=C) return time+"";
else if(map[ni][nj]=='.') {
map[ni][nj] = 'J';
jihun.add(new Point(ni, nj));
}
}
}
// 2. 불 번지기
size = fire.size();
for(int s=0; s<size; s++) {
Point p = fire.poll();
for(int d=0; d<4; d++) {
int ni = p.i + di[d];
int nj = p.j + dj[d];
if(ni<0 || ni>=R || nj<0 || nj>=C
|| map[ni][nj]=='#' || map[ni][nj]=='F') continue;
map[ni][nj] = 'F';
fire.add(new Point(ni, nj));
}
}
}
return "IMPOSSIBLE";
}
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];
for(int i=0; i<R; i++) {
map[i] = br.readLine().toCharArray();
for(int j=0; j<C; j++) {
if(map[i][j]=='J') jihun.add(new Point(i, j));
else if(map[i][j]=='F') fire.add(new Point(i, j));
}
}
System.out.println(exit());
}

}

1
This post is licensed under CC BY 4.0 by the author.