白駿7576号:トマト


白駿7576号:トマト

アイデア


これは典型的なBFS問題である.初めてのスタート時には、熟したトマトをDequeに入れ、上下左右に1マスずつ、熟したトマトがあるかどうかはDequeに入れます.焼いたトマトを1、2、3、4と表記するよりも...このように順番に表示すると、すべてのトマトが熟成するのに必要な日付が簡単に手に入ります.

これで日付が表示されます.0日から、最後に訪れた図[row][Col]から1を抜くと正解です.

コード#コード#

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

M, N = map(int, input().split())
tomatoBox = [list(map(int, input().split())) for _ in range(N)]
dy = [1, -1, 0, 0]
dx = [0, 0, 1, -1]


def bfs(graph):
    row, col = 0, 0
    dq = deque()
    for i in range(N):
        for j in range(M):
            if graph[i][j] == 1:
                dq.append([i, j])

    while dq:
        row, col = dq.popleft()
        for i in range(4):
            if 0 <= row + dy[i] < N and 0 <= col + dx[i] < M:
                if graph[row + dy[i]][col + dx[i]] == 0:
                    dq.append([row + dy[i], col + dx[i]])
                    graph[row + dy[i]][col + dx[i]] = graph[row][col] + 1

    for i in graph:
        if 0 in i:
            return -1
    return graph[row][col] - 1


print(bfs(tomatoBox))

おしゃべり


初めてDFSを使用して解凍と挿入を行います.問題を見ると、どうすればいいかを知るまで練習しなければならない.
白駿7569号:トマト問題は似たような問題で、3 Dリストを使用することができます.
import sys
from collections import deque
input = sys.stdin.readline

M, N, H = map(int, input().split())
tomatoBox = [[list(map(int, input().split())) for _ in range(N)] for _ in range(H)]

dy = [1, -1, 0, 0, 0, 0]
dx = [0, 0, 1, -1, 0, 0]
dz = [0, 0, 0, 0, 1, -1]


def bfs(graph):
    height, row, col = 0, 0, 0
    dq = deque()
    for i in range(H):
        for j in range(N):
            for k in range(M):
                if graph[i][j][k] == 1:
                    dq.append([i, j, k])

    while dq:
        height, row, col = dq.popleft()
        for i in range(6):
            if 0 <= height + dz[i] < H and 0 <= row + dy[i] < N and 0 <= col + dx[i] < M:
                if graph[height + dz[i]][row + dy[i]][col + dx[i]] == 0:
                    dq.append([height + dz[i], row + dy[i], col + dx[i]])
                    graph[height + dz[i]][row + dy[i]][col + dx[i]] = graph[height][row][col] + 1

    for i in graph:
        for j in i:
            if 0 in j:
                return -1
    return graph[height][row][col] - 1


print(bfs(tomatoBox))