トマト
12213 ワード
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出力
に答える
必要
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)
Reference
この問題について(トマト), 我々は、より多くの情報をここで見つけました https://velog.io/@grace0st/토마토-백준-7659-파이썬テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol