본문 바로가기
BOJ

백준(BOJ) 7569 토마토(Python)

by juLeena 2022. 7. 30.

문제 내용


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