티스토리 뷰

728x90

https://www.acmicpc.net/problem/5427

 

5427번: 불

상근이는 빈 공간과 벽으로 이루어진 건물에 갇혀있다. 건물의 일부에는 불이 났고, 상근이는 출구를 향해 뛰고 있다. 매 초마다, 불은 동서남북 방향으로 인접한 빈 공간으로 퍼져나간다. 벽에

www.acmicpc.net


  • 해설 : 

상근이는 빈 공간과 벽으로 이루어진 건물에 갇혀있다. 건물의 일부에는 불이 났고, 상근이는 출구를 향해 뛰고 있다.

 

매 초마다, 불은 동서남북 방향으로 인접한 빈 공간으로 퍼져나간다. 벽에는 불이 붙지 않는다. 상근이는 동서남북 인접한 칸으로 이동할 수 있으며, 1초가 걸린다. 상근이는 벽을 통과할 수 없고, 불이 옮겨진 칸 또는 이제 불이 붙으려는 칸으로 이동할 수 없다. 상근이가 있는 칸에 불이 옮겨옴과 동시에 다른 칸으로 이동할 수 있다.

 

빌딩의 지도가 주어졌을 때, 얼마나 빨리 빌딩을 탈출할 수 있는지 구하는 프로그램을 작성하시오.

 

 

 


  • 풀이 :

예전에 풀었던 고슴도치가 탈출하는 문제인 탈출(https://recordofwonseok.tistory.com/169?category=1000045) 문제와 동일한 문제이다. bfs를 진행하는데 불이 퍼지는 행위 1번, 탈출경로를 찾는 행위 1번의 총 2회 진행하면 된다.

 

 

 


  • 소스코드 : 

 

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
import sys
from collections import deque
dx = [-1,1,0,0]
dy = [0,0,-1,1]
 
def bfs():
 
    c = [[-1]*for _ in range(h)]
    m = 0
    c[s_queue[0][0][0]][s_queue[0][0][1]] = 0
    while f_queue[-1or s_queue[-1]:
        f_queue.append([])
        s_queue.append([])
        for z in f_queue[m]:
            x,y = z
            for i in range(4):
                ax = x + dx[i]
                ay = y + dy[i]
                if 0 <= ax < h and 0 <= ay < w:
                    if building[ax][ay] == ".":
                        building[ax][ay] = "*"
                        f_queue[-1].append([ax,ay])
        for z in s_queue[m]:
            x,y = z
            for i in range(4):
                ax = x + dx[i]
                ay = y + dy[i]
                if 0 <= ax < h and 0 <= ay < w:
                    if building[ax][ay] == "." and c[ax][ay] == -1:
                        c[ax][ay] = c[x][y] + 1
                        building[ax][ay] = "@"
                        s_queue[-1].append([ax,ay])
                else:
                    return c[x][y]+1
 
        m+=1
    return -1
 
if __name__ == "__main__":
    testCase = int(sys.stdin.readline())
    for _ in range(testCase):
        w,h = map(int,input().split())
        building = []
        s_queue = [[]]
        f_queue = [[]]
        for _ in range(h):
            building.append(list(input()))
        for i in range(h):
            for j in range(w):
                if building[i][j] == "@":
                    s_queue[0].append([i,j])
                if building[i][j] == "*":
                    f_queue[0].append([i,j])
        answer = bfs()
 
        if answer == -1:
            print("IMPOSSIBLE")
        else:
            print(answer)
 
cs
320x100

'Algorithm > DFS & BFS' 카테고리의 다른 글

(Python) - BOJ(7576번) : 토마토 I  (0) 2022.02.03
(Python) - BOJ(7569번) : 토마토 II  (0) 2022.02.03
(Python) - BOJ(3190번) : 뱀  (0) 2022.02.02
(Python) - BOJ(3187번) : 양치기 꿍  (0) 2022.02.02
(Python) - BOJ(3055번) : 탈출  (0) 2022.02.01
댓글
© 2022 WonSeok, All rights reserved