본문 바로가기
Beakjun_Solve/BFS, DFS

#7569번 토마토 #백준 #BFS #삼차원 배열

by CodingStriker 2024. 2. 19.
반응형

#문제 링크

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

 

7569번: 토마토

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

www.acmicpc.net

#code

#7569 토마토 BFS활용

import sys
from collections import deque
input = sys.stdin.readline

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

data = []

def bfs(data, data_1):
    queue = deque(data_1)
    for d in queue:
        v[d[0]][d[1]][d[2]] = 1
    count = 0
    while queue:
        size = len(queue)
        for _ in range(size):
            cx, cy, cz = queue.popleft()
            for i, j, k in zip(x, y, z):
                dx = cx + i
                dy = cy + j
                dz = cz + k

                if 0 <= dx < h and 0 <= dy < n and 0 <= dz < m and v[dx][dy][dz] == -1 and data[dx][dy][dz] != '-1' and data[dx][dy][dz] != '1':
                    queue.append((dx, dy, dz))
                    v[dx][dy][dz] = 1
       
        count += 1
    for i in range(h):
        for j in range(n):
            for k in range(m):
                if v[i][j][k] == -1 and data[i][j][k] != '-1':
                    return -1

    return max(0, count - 1)

x = [1, -1, 0, 0, 0, 0]
y = [0, 0, 1, -1, 0, 0]
z = [0, 0, 0, 0, 1, -1]

for i in range(h):
    data_xy = []
    for j in range(n):
        data_xy.append(input().strip().split())
    data.append(data_xy)

data_1 = []
v = [[[-1]*m for _ in range(n)] for _ in range(h)]
for i in range(h):
    for j in range(n):
        for k in range(m):
            if data[i][j][k] == '1':
                data_1.append((i, j, k))
            elif data[i][j][k] == '-1':
                v[i][j][k] = 1  # 익지 못하는 토마토로 표시



print(bfs(data, data_1))
반응형