알고리즘/백준

백준 7569: 토마토 (Python)

sssbin 2022. 2. 2. 00:53

 

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

 

7569번: 토마토

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

www.acmicpc.net

 

7576번 문제의 3차원 버전이다

3차원이라는 것만 신경 써주고 똑같이 풀면 된다

pypy3로 제출함

 

from collections import deque

m, n, h = map(int, input().split())
tomato = [[] for _ in range(h)]
for i in range(h):
    for j in range(n):
        data = list(map(int, input().split()))
        tomato[i].append(data)

queue = deque()
for i in range(h):
    for j in range(n):
        for k in range(m):
            if tomato[i][j][k] == 1:
                queue.append([i, j, k])

def bfs():
    dx = [1, -1, 0, 0, 0, 0]
    dy = [0, 0, 1, -1, 0, 0]
    dz = [0, 0, 0, 0, 1, -1]

    while queue:
        z, x, y = queue.popleft()

        for i in range(6):
            mx = x + dx[i]
            my = y + dy[i]
            mz = z + dz[i]

            if mx < 0 or mx >= n or my < 0 or my >= m or mz < 0 or mz >= h:
                continue

            if tomato[mz][mx][my] == 0:
                queue.append([mz, mx, my])
                tomato[mz][mx][my] = tomato[z][x][y] + 1

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