반응형
#문제 링크
https://www.acmicpc.net/problem/7569
7569번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,
www.acmicpc.net
#code
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))
반응형
'Beakjun_Solve > BFS, DFS' 카테고리의 다른 글
#백준, [#1926_그림], #BFS, #DFS (0) | 2024.08.07 |
---|---|
#11724_연결 요소의 개수 #DFS #파이썬 (0) | 2024.03.02 |
#1697_숨바꼭질 #백준 #파이썬 #BFS (1) | 2024.02.29 |
#재귀함수 DFS #1012 유기농 배추 (0) | 2024.02.22 |
#BFS #21736 #백준 #파이썬 #헌내기는 친구가 필요해 (1) | 2024.02.18 |