トマト


bfsの概念を把握しているようなので、最後まで答えを探さないでほしいです.最後の一人が解けましたが、時間がかかりました.三次元問題は初めてで、面白かったです.


に答える


必要
1.データ壁の3 D配置
2.一日で数え上げる変数
3.熟トマト座標を保存するQ
4.東南西北上下方向データ(オプション)
ろんりじゅんじょ
1.3 Dデータの受信
2.値が1の場合はキューに入れ、count one変数を上げます.
3.値が-1の場合、count minus変数が上昇します.
4.データ個数から空のトマト数(-1個)をansに入れる.
5.熟したトマトの数と空のトマトの格数を加算し、最大値は0です.
5.完熟トマトの周りを回る
6.熟していないトマトがあれば、今のトマトが熟した日に+1を加えて保存します.
7.遅くとも成熟した日をmax numに入れる.
8.同時にcount one値を上げます.
9.count one値がans値に等しい場合、max numから1日の時間出力を減算します.
10.または-1出力

コード#コード#

from sys import stdin
from collections import deque

M,N,H = map(int, stdin.readline().split())
li = [[[0]*M for i in range(N)]for j in range(H)]
count_one = 0
count_minus =0
max_num = 1
queue = deque()

for i in range(H):
    for j in range(N):
        tmp = list(map(int, stdin.readline().split()))
        for k in range(M):
            li[i][j][k] = tmp[k]
            if tmp[k] == 1:
                queue.append((i,j,k))
                count_one +=1
            elif tmp[k] == -1:
                count_minus +=1

ans =M*N*H - count_minus

dx ,dy , dz = 	[1, -1, 0, 0, 0, 0], 
		[0, 0, 1, -1, 0, 0], 
		[0, 0, 0, 0, 1, -1]
        
if ans - count_one== 0 :
    print(0)
else:
    while queue:
        z, y, x = queue.popleft()

        for i in range(6):
            nx = x + dx[i]
            ny = y + dy[i]
            nz = z + dz[i]

            if 0<= nx < M and 0<=ny < N and 0 <= nz < H:
                if li[nz][ny][nx] == 0:
                    li[nz][ny][nx] = li[z][y][x] +1
                    max_num = max(li[nz][ny][nx],max_num)
                    count_one +=1
                    queue.append((nz,ny,nx))
        
    if count_one == ans:
        print(max_num -1)
    else:
        print(-1)