본문 바로가기
알고리즘/python

5427번 불(python3)

by 펀구구 2022. 2. 21.

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

 

5427번: 불

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

www.acmicpc.net

딱 봐도 bfs로 접근하면 풀리는 문제다.

이 문제의 포인트는 bfs를 진행할 때 불이 번지는 것부터 하는 것이다. 그리고 사람이 방문했던 칸은 불이 번질 필요가 없다. 어차피 사람보다 늦게 불이 도착하면 그 불은 이 문제에는 상관이 없어지기 때문이다.

 

import sys
from collections import deque

dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]


def bfs():
    M, N = map(int, input().split())
    data = []
    for _ in range(N):
        a = sys.stdin.readline()
        temp = []
        for i in a:
            if i != '\n':
                temp.append(i)
        data.append(temp)

    visited = [[0] * M for _ in range(N)]
    if M == 1 and N == 1:
        print(1)
        return

    queue = deque()
    for i in range(N):
        for j in range(M):
            if data[i][j] == '*':
                queue.append([i, j])
                visited[i][j] = -1
    for i in range(N):
        for j in range(M):
            if data[i][j] == '@':
                queue.append([i, j])
                visited[i][j] = 1
    flag = False
    while queue:
        x, y = queue.popleft()
        if x == 0 or x == N - 1 or y == 0 or y == M - 1:
            if data[x][y] == "@":
                print(visited[x][y])
                flag = True
                break
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if visited[x][y] >= 0:
                if 0 <= nx < N and 0 <= ny < M:
                    if data[nx][ny] == '.' and visited[nx][ny] == 0:
                        visited[nx][ny] = visited[x][y] + 1
                        data[nx][ny] = '@'
                        queue.append([nx, ny])
            if visited[x][y] == -1:
                if 0 <= nx < N and 0 <= ny < M:
                    if data[nx][ny] == '.' and visited[nx][ny] == 0:
                        visited[nx][ny] = -1
                        data[nx][ny] = "*"
                        queue.append([nx, ny])
    if not flag:
        print("IMPOSSIBLE")


T = int(input())
for _ in range(T):
    bfs()

'알고리즘 > python' 카테고리의 다른 글

17144번 미세먼지 안녕!(python3)  (0) 2022.02.18
11559번 Puyo Puyo(python3)  (0) 2022.02.18
14888번 연산자 끼워넣기(python3)  (0) 2022.02.11
2573번 빙산(python3)  (0) 2022.02.06
16236번 아기상어(python3)  (0) 2022.02.06