標準7569|トマト(BFS、3 Dアレイ)


問題のソース:https://www.acmicpc.net/problem/7569


質問する

  • トマトが保管されている大きな倉庫があります.
  • の格子に1つずつ入れ、箱を垂直に積み上げて保管します.
  • に保存されているトマトには、成熟しているものもあれば、まだ成熟していないものもあります.
  • 保管1日後、熟したトマトに隣接する未熟のトマト
    熟したトマトの影響で熟成する.
  • トマトが隣接する場所は、上、下、左、右、前、後の6方向に位置するトマトを意味する.
  • 対角線方向のトマトは影響しません.
  • トマトは自分で成熟しません.
  • トマトは何日後に熟しましたか?
  • 入力

  • 行目
  • m:箱幅(2<=m<=100)
  • n:箱の深さ(2<=n<=100)
  • h:箱の高さ(1<=h<=100)
  • 行目から
  • 一番下の箱から一番上の箱に保存されているトマトの情報
  • 1:熟トマト
  • 0:未熟トマト
  • -1:トマトを含まない格子
  • しゅつりょく

  • トマトを全部煮るには少なくとも数日かかると計算されています.
  • 貯蔵からすべてのトマトが熟成したら0を出力します.
  • トマトがまだ完全に成熟していない場合は、-1を印刷してください.
  • 問題の処理方法

  • 三次元であるため,入力とインデックスの格納が困難である.
  • の他にBFS利用の問題もあります.
  • プロセス

  • 熟成トマトの位置をキューに保存し、BFSを実行します.
  • BFS検索を行ったところ、Qでトマトを除いて隣のトマトに熟したトマトがあるかどうか、
  • 熟成したトマトオーブンに入れ、トマトを熟成するのに要する時間に1を加えます.
  • キューリクエストまで2~3回の手順を繰り返します.
  • BFSナビゲーション後、未熟トマトがあれば−1を出力し、そうでなければすべての成熟に要する時間を出力する.
  • 3 Dリスト索引


  • の3 Dリストの場合、呼び出し時리스트 [ 높이인덱스 ] [ 세로인덱스 ] [ 가로인덱스 ] = 값の形式で呼び出す.
  • for h in height:
        for r in row:
            for c in column:
                array[h][r][c] = 1
  • 3 Dリスト計算
  • 3d_array = [[[0 for _ in range(column)] for _ in range(row)] for _ in range(depth)]

    コード#コード#

    import sys
    from collections import deque
    
    input = sys.stdin.readline
    m, n, h = map(int, input().split())
    
    # 3차원 토마토 정보 저장
    tomatoes = [[list(map(int, input().split())) for _ in range(n)] for _ in range(h)]
    
    queue = deque()
    
    for i in range(h):
        for j in range(n):
            for k in range(m):
                # 높이(h), 가로(x), 세로(y) 순
                if tomatoes[i][j][k] == 1:
                    queue.append((i, j, k))
    
    # x축, y축, z축 3차원 이동을 위한 방향 변수 설정
    dx = [1, -1, 0, 0, 0, 0]
    dy = [0, 0, 1, -1, 0, 0]
    dz = [0, 0, 0, 0, 1, -1]
    
    def bfs():
        while queue:
            z, x, y = queue.popleft()
    
            for i in range(6):
                nx = x + dx[i]
                ny = y + dy[i]
                nz = z + dz[i]
    
                if 0 <= nx < n and 0 <= ny < m and 0 <= nz < h:
                    if tomatoes[nz][nx][ny] == 0:
                        tomatoes[nz][nx][ny] = tomatoes[z][x][y] + 1
                        queue.append((nz, nx, ny))
    
    bfs()
    
    
    
    flag = False
    answer = -1
    
    for i in range(h):
        for j in range(n):
            for k in range(m):
                if tomatoes[i][j][k] == 0:
                    flag = True
                    
                answer = max(answer, tomatoes[i][j][k])
    
    # BFS 탐색으로 익은 토마토의 인접한 안 익은 토마토들에 대해 익게 만들었지만
    # 만약 안익은 토마토( 0 ) 이 존재하면 -1을 출력하고 다 익었다면 제일 큰 값에 -1을 해준 값을 출력한다.
    if flag:
        answer = -1
    elif answer == 1:
        answer = 0
    else:
        answer -= 1
    
    print(answer)