[伯俊7569]トマト(三次元)餅

12683 ワード

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

🥚質問する



🥚入力/出力



🍳コード#コード#

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

m, n, h = map(int, input().split())
box = [[list(map(int, input().split())) for _ in range(n)] for __ in range(h)]


def bfs(q):
    moves = [(-1, 0, 0), (1, 0, 0),
             (0, -1, 0), (0, 1, 0),
             (0, 0, -1), (0, 0, 1)]

    while q:
        level, row, col = q.popleft()

        for move in moves:
            lv = level + move[0]
            r = row + move[1]
            c = col + move[2]
            if 0 <= lv < h and 0 <= r < n and 0 <= c < m:
                if box[lv][r][c] == 0:
                    box[lv][r][c] = box[level][row][col] + 1
                    q.append((lv, r, c))


# deque에 1이 있는 모든 위치를 넣고 시작
q = deque([])
answer = 0
for level in range(h):
    for row in range(n):
        for col in range(m):
            if box[level][row][col] == 1:
                q.append((level, row, col))

# bfs 실행
bfs(q)

# answer는 box에서의 최대값 - 1
answer = 0
for inner in box:
    for row in inner:
        for x in row:
            answer = max(answer, x)
answer -= 1

# 토마토가 모두 익지는 못할 때 = 여전히 0이 존재할 때
for inner in box:
    for row in inner:
        if 0 in row:
            answer = -1
            break

print(answer)

🧂アイデア


  • ボックスの数、水平バー、垂直バー->3 Dリストとして表示
  • box[level][row][col]

  • 1(熟トマト)すべての位置をDequeに入れBFSで検索

  • トマトの熟成を計算するのに数日かかる方法🍅
  • box[level][row][col]の値はトマトの熟成に必要な日数+1にしましょう.
  • トマト(box[level][row][col]>=1)の位置がbox[level][row][col]であれば
  • box[level][col]で上、下、左、右、前、後方向に位置する熟成可能なトマト(e.g.,box[lv][r][c]=0)が見つかった場合、その値をbox[level][row][col]+1(e.g.,box[lv][r][c]=box[level][row][col]1)
  • に更新する

  • トマトのすべてが成熟するのに少なくとも数日かかる方法を計算する.🍅
  • bfsのトマトを焼いた後、
  • のアレイ全体での最大値を求め、ここで-1を出力します.
  • 🙏 反省する


    どこが間違っているのか分からないが,1時間も口ずさんだ.
    最後に、配列全体で最大値を求めると、
    max(map(max, map(max, box)))
    コードを使いました...!私は考えずにコードを書いて、結果のない反例を見つけて、まるで地獄です......🤦‍♂️
    基本ですが、注意を引くために、この問題を個別の投稿にまとめてアップロードしましょう.