문제풀이/DFS & BFS

[파이썬] [BFS] 백준 7569 토마토

승무_ 2022. 4. 2. 08:31

문제

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

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

코드

import sys
from collections import deque
input=sys.stdin.readline
queue=deque()

m,n,h=map(int, input().split()) #n행 m열

dn=[0,0,-1,1,0,0]
dm=[-1,1,0,0,0,0]
dh=[0,0,0,0,-1,1]

graph=[]

for i in range(h):
    temp=[]
    for j in range(n):
        temp.append(list(map(int, input().split())))
        for k in range(m):
            if temp[j][k]==1:
                queue.append([i,j,k])
    graph.append(temp)

while queue:
    z,r,c=queue.popleft()

    for i in range(6):
        nn=r+dn[i]
        nm=c+dm[i]
        nh=z+dh[i]

        if 0<=nn<n and 0<=nm<m and 0<=nh<h and graph[nh][nn][nm]==0:
                graph[nh][nn][nm]=graph[z][r][c]+1
                queue.append([nh,nn,nm])

day=0
for i in range(h):
    for j in range(n):
        for k in range(m):
            if graph[i][j][k]==0:
                print(-1)
                exit(0)
            day=max(day, graph[i][j][k])
print(day-1)