from typing import List
from collections import deque
def orangesRotting(grid:List[List[int]])->int:
t=0
q=deque() #队列,将腐烂橘子入队
fresh=0 #统计新鲜橘子
rows=len(grid)
cols=len(grid[0])
dirs=[(0,1),(0,-1),(1,0),(-1,0)] #上下左右四个方向
#先把腐烂橘子入队列,统计新鲜橘子数量
for i in range(rows):
for j in range(cols):
if grid[i][j]==2:
q.append((i,j)) #腐烂橘子坐标入队
elif grid[i][j]==1:
fresh+=1
while q and fresh>0:
q_len=len(q)
for _ in range(q_len):
r0,c0=q.popleft() #取出腐烂橘子坐标(i,j)
for k in dirs: #判断它四个方向的橘子
r=r0+k[0]
c=c0+k[1]
if r<0 or r>=rows or c<0 or c>=cols or grid[r][c]!=1:
continue
grid[r][c]=2 #将新鲜橘子变坏
q.append((r,c)) #腐烂橘子加入队列
fresh-=1 #新鲜橘子减一
t+=1
return -1 if fresh else t
def main():
grid= [[2,1,1],[1,1,0],[0,1,1]] #答案输出4
t=orangesRotting(grid)
print(t)
return
if __name__=="__main__":
main()
思路:多源BFS搜索
1.使用队列,将腐烂橘子入队,每次取出一个腐烂橘子,就判断它的四个方向上的橘子是否是新鲜橘子,若是,则扩散腐烂,然后入队列,新鲜橘子数量减一。
2.如果最后还有新鲜橘子,则返回-1。