トマト


質問する



コード#コード#

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

m,n = map(int,input().split())

dx = [1,-1,0,0]
dy = [0,0,-1,1]

queue = deque()
graph=[]

for i in range(n):
    graph.append(list(map(int, input().rstrip().split())))

#붙이기 

#익은토마토 조사 
for i in range(n):
    for j in range(m):
        if graph[i][j]==1:
            queue.append([i,j])

def bfs():
  while queue:
      a,b = queue.popleft() #i.j삽입 
      for i in range(4):
          cx = a+dx[i]
          cy = b+dy[i]
          if 0<=cx<n  and 0<=cy<m and graph[cx][cy]==0: 
              graph[cx][cy] = graph[a][b] + 1 #시간 더해나감 
              queue.append([cx,cy])
# print(graph)
bfs()
flag = 1 # 1 익음 0 안익음  
time = -2 
# print(graph)
for j in graph:
    for k in j:
        if k==0: #익지 않은것이 존재 
            flag =0 #안익음... 
        time =max(time,k)

if time == 1 : #최댓값이 1 #다익음   
    print(0)
elif flag ==0: #안익은게 있음/// 
    print(-1)
else :
    print(time - 1) #1초부터 시작하니 1빼줌 

解説


この問題もBFSで行います.
理由はトマトを順番に焼いていくこと.
そして、上下左右を見るために、方向ベクトルを再取得して使用します.
入力値を受け入れ、BFSにインデックスを作成するキューに要素のインデックス値を挿入します.

BFS


Cueを1つ抜いて、Cueの上下左右に熟しているトマトがあるかどうかなら焼いてもいいのですが、このトマトを入れる価格は前に保存していたトマトに+1を加えればいいのです!
似たような形は見えませんか?!?!
これは前に解いた問題で、隠れん坊はろうそくを貯蔵するように、次第にろうそくの形式を増やします!
これは典型的なBFSであり,1を含む元素は増加すると2を含む元素は拡散し続ける.
このようにして、最後にリスト全体を見て、熟していないトマトがあればflag=0を保存します.
また,timeという変数は時間の最値を出力し,いずれも熟成した状態からであればtimeは1を格納する.
これに対して、ひとつひとつ熟していれば、その時間の最安値が時間に保存されます.
したがって、最後の条件文を使用して、3つの場合の適切な状況を検索して出力します.