시간 제한. 메모리 제한. 제출. 정답. 맞힌 사람. 정답 비율
1 초 | 256 MB | 26130 | 6700 | 4287 | 23.505% |
문제
상근이는 빈 공간과 벽으로 이루어진 건물에 갇혀있다. 건물의 일부에는 불이 났고, 상근이는 출구를 향해 뛰고 있다.
매 초마다, 불은 동서남북 방향으로 인접한 빈 공간으로 퍼져나간다. 벽에는 불이 붙지 않는다. 상근이는 동서남북 인접한 칸으로 이동할 수 있으며, 1초가 걸린다. 상근이는 벽을 통과할 수 없고, 불이 옮겨진 칸 또는 이제 불이 붙으려는 칸으로 이동할 수 없다. 상근이가 있는 칸에 불이 옮겨옴과 동시에 다른 칸으로 이동할 수 있다.
빌딩의 지도가 주어졌을 때, 얼마나 빨리 빌딩을 탈출할 수 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수가 주어진다. 테스트 케이스는 최대 100개이다.
각 테스트 케이스의 첫째 줄에는 빌딩 지도의 너비와 높이 w와 h가 주어진다. (1 ≤ w,h ≤ 1000)
다음 h개 줄에는 w개의 문자, 빌딩의 지도가 주어진다.
- '.': 빈 공간
- '#': 벽
- '@': 상근이의 시작 위치
- '*': 불
각 지도에 @의 개수는 하나이다.
출력
각 테스트 케이스마다 빌딩을 탈출하는데 가장 빠른 시간을 출력한다. 빌딩을 탈출할 수 없는 경우에는 "IMPOSSIBLE"을 출력한다.
상근이가 이동하는 동시에 불도 이동한다는 게
그래프 상에서 어떻게 while을 써야할 지 감이 잘 안잡혀서 어려웠다.
결론 : while 상근q 내부에, while 불q 가 돌면서 불을 옮긴다
from collections import deque
import sys
input = sys.stdin.readline
dx = [1, -1, 0, 0]
dy = [0, 0, -1, 1]
def bfs():
global q, f
while q:
temp = deque()
while q:
x, y = q.popleft()
if (x == h - 1 or y == w - 1 or x == 0 or y == 0) and s[x][y] != "*": return s[x][y]
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < h and 0 <= ny < w and s[nx][ny] == "." and s[x][y] != "*":
s[nx][ny] = s[x][y] + 1
temp.append([nx, ny])
q = temp ##### 중요
temp = deque()
while f:
x, y = f.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < h and 0 <= ny < w and visit[nx][ny] == 0 and s[nx][ny] != "#":
s[nx][ny] = "*"
visit[nx][ny] = 1
temp.append([nx, ny]) ##### 중요
f = temp
t = int(input())
for i in range(t):
w, h = map(int, input().split())
s, f, q = [], deque(), deque()
visit = [[0] * w for i in range(h)]
for j in range(h):
a = list(input().strip())
s.append(a)
for k in range(w):
if a[k] == "@":
s[j][k] = 0
q.append([j, k])
elif a[k] == "*":
f.append([j, k])
visit[j][k] = 1
result = bfs()
print(result + 1 if result != None else "IMPOSSIBLE")
참고 블로그 (최고세요...)
'⚡️algorithm' 카테고리의 다른 글
[BFS, 파이썬] 백준 2206. 벽 부수고 이동하기 (0) | 2022.05.06 |
---|---|
[BFS, 파이썬] 백준 3055. 탈출 - hard (0) | 2022.05.06 |
[BFS, 파이썬] 백준 5014. 스타트링크 (0) | 2022.05.05 |
[BFS, 파이썬] 백준 1697. 숨바꼭질 (0) | 2022.05.05 |
[BFS] 백준 6593. 상범빌딩 (feat. 3차원 배열) (0) | 2022.05.04 |