BFS 문제.
일반적으로는 dx와 dy만 사용하지만, 이 문제는 dz도 사용해서 각 이동마다 고려해준다.
queue에서 좌표를 한 번 꺼내고, 주변 토마토를 익게 한 다음 현재 익은 토마토의 개수가 전체 토마토의 개수와 같다면 break한다.
만약 위에서 break하지 못했다면 이는 모든 토마토를 익게할 수 없는 경우이다.
그 외에는 while문을 돌기 전 현재 익은 토마토의 개수와 전체 토마토의 개수가 같다면 0을 출력한다.
코드는 다음과 같다.
# -*- coding: utf-8 -*-
import sys
from collections import deque
import heapq
import copy
from itertools import combinations
from itertools import permutations
import bisect
input=sys.stdin.readline
#sys.setrecursionlimit(100000000)
m,n,h=map(int,input().split())
L=[]
c=0
a=m*n*h
dx=[1,-1,0,0,0,0]
dy=[0,0,1,-1,0,0]
dz=[0,0,0,0,1,-1]
queue=deque()
visited=[[[0]*m for i in range(n)] for j in range(h)]
L=[]
for i in range(h):
X=[]
for j in range(n):
A=list(map(int,input().split()))
for k in range(m):
if A[k]==1:
queue.append([i,j,k,0])
visited[i][j][k]=1
c+=1
elif A[k]==-1:
a-=1
X.append(A)
L.append(X)
if c!=a:
flag=0
while queue:
z,x,y,k=queue.popleft()
for i in range(6):
nx=x+dx[i]
ny=y+dy[i]
nz=z+dz[i]
if 0<=nz<h and 0<=nx<n and 0<=ny<m:
if L[nz][nx][ny]==0 and not visited[nz][nx][ny]:
queue.append([nz,nx,ny,k+1])
visited[nz][nx][ny]=1
c+=1
if c==a:
flag=k+1
break
if c!=a:
print(-1)
else:
print(flag)
else:
print(0)
pypy로 제출해서 통과했다.
'BOJ' 카테고리의 다른 글
백준(BOJ) 1338 알 수 없는 번호(Python) (0) | 2022.07.30 |
---|---|
백준(BOJ) 7576 토마토(Python) (0) | 2022.07.30 |
백준(BOJ) 1083 소트(Python) (0) | 2022.07.25 |
백준(BOJ) 12892 생일 선물(Python) (0) | 2022.07.23 |
백준(BOJ) 2580 스도쿠(Python) (0) | 2022.07.23 |