📜  腐烂所有橙子所需的最短时间(1)

📅  最后修改于: 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。

结论

通过广度优先搜索算法,我们可以计算出腐烂所有橙子所需的最短时间。这个过程可以通过编写代码实现,从而可以有效地解决相关问题。