코딩테스트 준비/[백준]

[백준] 5427번 불 - 파이썬

bled 2021. 6. 20. 15:14

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

 

5427번: 불

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

www.acmicpc.net

 

[code]

from collections import deque
import sys

input = sys.stdin.readline
dx = [1,-1,0,0]
dy = [0,0,1,-1]

def bfs(start_r, start_c):

    q.append([start_r, start_c])

    global time
    while q:
        time += 1
        qlen = len(q)
        for _ in range(qlen):
            y, x = q.popleft()
            matrix[y][x] = '@'
            for i in range(4):
                nx = x + dx[i]
                ny = y + dy[i]

                if ny < 0 or ny >=h or nx < 0 or nx >= w:
                    return time

                if 0 <= ny < h and 0 <= nx < w:
                    if matrix[ny][nx] == '.':
                        matrix[ny][nx] = '@'
                        q.append([ny, nx])

        fire()
    return 'IMPOSSIBLE'


def fire():
    qlen = len(fire_q)
    for i in range(qlen):
        y, x = fire_q.popleft()
        for j in range(4):
            nx = x + dx[j]
            ny = y + dy[j]
            if 0 <= ny < h and 0 <= nx < w and matrix[ny][nx] == '.':
                matrix[ny][nx] = '*'
                fire_q.append([ny, nx])



for _ in range(int(input())):
    w, h = map(int, input().split())
    q = deque()
    fire_q = deque()
    matrix = []


    time = 0

    for i in range(h):
        matrix.append(list(input().strip()))
        for j in range(w):
            if matrix[i][j] == '@':
                start_r, start_c = i, j
            elif matrix[i][j] == '*':
                fire_q.append([i, j])

    fire()
    print(bfs(start_r, start_c))

 

 

유사 문제

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

 

4179번: 불!

입력의 첫째 줄에는 공백으로 구분된 두 정수 R과 C가 주어진다. 단, 1 ≤ R, C ≤ 1000 이다. R은 미로 행의 개수, C는 열의 개수이다. 다음 입력으로 R줄동안 각각의 미로 행이 주어진다.  각각의 문

www.acmicpc.net