📅  最后修改于: 2023-12-03 14:57:06.588000             🧑  作者: Mango
本文将探讨如何编写一个程序,通过模拟橙子腐烂的过程,计算腐烂所有橙子所需的最短时间。
橙子的腐烂是一个不断扩散的过程。假设橙子腐烂是在四周传染,则我们可以使用广度优先搜索(BFS)算法模拟这个过程。
具体来说,我们可以定义一个二维数组,表示橙子的状态。0表示橙子还没有腐烂,1表示已经腐烂。我们将所有已经腐烂的橙子加入一个队列中,并以它们为起点,向四周扩散。每次扩散时,我们将与当前烂橙相邻的健康橙变成腐烂状态,加入队列中。重复这个过程,直到队列为空,即所有橙子都已腐烂。在这个过程中,我们可以记录扩散的次数,即腐烂所有橙子所需的最短时间。
def orangesRotting(grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
m, n = len(grid), len(grid[0])
queue = []
for i in range(m):
for j in range(n):
if grid[i][j] == 2:
queue.append((i, j, 0))
res = 0
while queue:
x, y, t = queue.pop(0)
for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
nx, ny = x + dx, y + dy
if 0 <= nx < m and 0 <= ny < n and grid[nx][ny] == 1:
grid[nx][ny] = 2
queue.append((nx, ny, t+1))
res = max(res, t+1)
for row in grid:
if 1 in row:
return -1
return res
我们使用BFS来模拟橙子的腐烂过程,使用一个队列queue记录当前已经腐烂的橙子的坐标和腐烂时刻t,其中t表示当前腐烂的时间。
对于每个已经腐烂的橙子,我们向四周扩散,如果与其相邻的橙子是健康的,则将其状态改为腐烂,并将其坐标和时间加入队列中。不断重复这个过程,直到队列为空,即所有橙子都已腐烂。
在这个过程中,我们还需要记录当前的时间。实际上,最终需要的时间就是最后一个腐烂的橙子的腐烂时间,因此我们可以在每次加入新的腐烂橙子时,更新最终需要的时间。
最后,我们还需要检查是否存在无法被腐烂的橙子,如果有,则返回-1。
通过广度优先搜索算法,我们可以计算出腐烂所有橙子所需的最短时间。这个过程可以通过编写代码实现,从而可以有效地解决相关问题。