[白俊]7569号-トマト
📩 ソース
質問する
獣医トマト農場にはトマトを保管する大きな倉庫がある.トマトは下図のように1つずつ四角い格子に入れて倉庫に保管しています.
倉庫に保管されているトマトの中には、熟しているものもあれば、まだ熟していないものもあります.1日保管した後、熟したトマトに隣接する未熟のトマトは、熟したトマトの影響を受けて成熟する.1つのトマトの隣接する場所は、左、右、前、後の4つの方向に位置するトマトを意味する.対角線方向に影響を与えないトマトは、トマトが自分で成熟しないと仮定します.哲洙は倉庫に保管されているトマトが何日で熟れるか、最低日数を知りたいと思っている.
倉庫にトマトのチェックボックスの大きさ、熟したトマトと未熟なトマトの情報を保管している場合、数日後には、トマトが熟しているかどうか、最低日数を求めるプログラムを作成します.しかし、箱のいくつかの格にはトマトが入っていないかもしれません.
入力
1行目は、ブロックサイズを表す2つの整数M、N、およびスタックされたブロック数を表すHを与える.Mは箱の横格子数,Nは箱の縦格子数を表す.しかし,2≦M≦100,2≦N≦100,1≦H≦100であった.2行目から、一番下の箱から一番上の箱まで、中に貯まっているトマトの情報があります.つまり、2行目からN行目まで、箱の中のトマトの情報が与えられます.各行の箱の横線のトマトの状態はM個の整数です.整数1は熟したトマトを表し、整数0は未熟のトマトを表し、整数-1はトマトを含まない格子を表す.このようなN線はH回繰り返し与えられる.
トマトが1つ以上ある場合にのみ入力します.
しゅつりょく
トマトを計算するには少なくとも数日かかります.保存からすべてのトマトが熟成している場合は0を、トマトが熟成していない場合は-1を出力します.
👉 の意見を打診
bfs
で熟したトマト(1)に変えた.visited
の値を1にします.熟していないトマトの個数(cnt)も同時に調べた.visited[nk][ni][nj] = visited[k][i][j] + 1
と書かれています.일
を返すために使用され、[nk][ni][nj]にアクセスした値は最初に熟成したトマト(0)から1増加した.つまり、最後の完熟トマトの値(アクセス[nk][ni][nj])では、1は私たちが望む値を意味する.def bfs():
q = [0] * (m*n*h)
front = -1
rear = -1
# 안익은 토마토 개수
cnt = 0
day = 0
for k in range(h):
for i in range(n):
for j in range(m):
if tomato[k][i][j] == 1:
rear += 1
q[rear] = (k, i, j)
elif tomato[k][i][j] == 0:
cnt += 1
if cnt == 0:
return 0
while front != rear:
front += 1
k, i, j = q[front]
for dk, di, dj in [[-1, 0, 0], [1, 0, 0], [0, -1, 0, ], [0, 1, 0], [0, 0, -1], [0, 0, 1]]:
nk, ni, nj = k + dk, i + di, j + dj
if 0 <= nk < h and 0 <= ni < n and 0 <= nj < m and tomato[nk][ni][nj] == 0 and visited[nk][ni][nj] == 0:
visited[nk][ni][nj] = visited[k][i][j] + 1
cnt -= 1
if visited[nk][ni][nj] > day:
day = visited[nk][ni][nj]
rear += 1
q[rear] = (nk, ni, nj)
if cnt != 0:
return -1
else:
return day
m, n, h = map(int, input().split())
tomato = [[list(map(int, input().split())) for _ in range(n)] for _ in range(h)]
visited = [[[0] * m for _ in range(n)] for _ in range(h)]
print(bfs())
Reference
この問題について([白俊]7569号-トマト), 我々は、より多くの情報をここで見つけました https://velog.io/@letgodchan0/백준-7569번-토마토テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol