Python : 토마토 2 (BFS)

cad·2022년 2월 10일
0

Algorithm

목록 보기
30/33

문제

문제가 너무 길어서 링크로 대체

풀이

  • 기존 토마토 문제에서 위 아래로 틀을 여러겹 쌓아 탐색의 범위를 넓힌 문제이다.
  • 좌표평면 탐색을 dx, dy, dz 로 총 6방향으로 탐색하면 토마토1 과 다를게 없다!
  • 2차평면에 비해서 탐색해야할게 많아서 입력값을 input에서 sys.stdin.readline으로 바꿔야 한다.

전체코드

import sys
from collections import deque

r = sys.stdin.readline


def bfs():
    while queue:
        height, line, seq = queue.popleft()

        for i in range(6):
            # 다음 높이
            a = height + dz[i]
            # 다음 줄
            b = line + dy[i]
            # 다음 칸
            c = seq + dx[i]
            if 0 <= a < h and 0 <= b < n and 0 <= c < m and graph[a][b][c] == 0:
                queue.append([a, b, c])
                graph[a][b][c] = graph[height][line][seq] + 1

    day = 0
    for i in graph:
        for j in i:
            for k in j:
                if k == 0:
                    return -1
            # 끝까지 익었는지 확인
            day = max(day, max(j))
    return day - 1


if __name__ == '__main__':
    dx = [1, 0, 0, -1, 0, 0]
    dy = [0, 1, 0, 0, -1, 0]
    dz = [0, 0, 1, 0, 0, -1]
    queue = deque()

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

    graph = list(list(list(map(int, r().split())) for _ in range(n)) for _ in range(h))

    # 몇 층?
    for height in range(len(graph)):
        # 몇 번째 줄?
        for line in range(len(graph[height])):
            # 몇 번째 칸?
            for seq in range(len(graph[height][line])):
                if graph[height][line][seq] == 1:
                    queue.append([height, line, seq])

    print(bfs())
profile
Dare mighty things!

0개의 댓글