LeetCode 腐烂的橘子

腐烂的橘子


题目来源:[https://leetcode-cn.com/probl...
](https://leetcode-cn.com/probl...
)

题目


在给定的网格中,每个单元格可以有以下三个值之一:

值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。

返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。

示例 1:

[站外图片上传中...(image-d1670e-1583324519567)]

输入:[[2,1,1],[1,1,0],[0,1,1]]
输出:4

示例 2:

输入:[[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。

示例 3:

输入:[[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。

提示:

1 <= grid.length <= 10
1 <= grid[0].length <= 10
grid[i][j] 仅为 0、1 或 2

解题思路


  1. 思路:广度优先搜索 + 队列;
  2. 首先找出腐烂的橘子,添加到队列 queue 中;
  3. 当队列(注意:只允许腐烂的橘子入队)不为空且出队(这里弹出首元素)时,如题意所述,与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子先标记为 2(也就是标记为腐烂的橘子),即是 grid[x + dx][y + dy] = 2,这里 x ,y 表示当前腐烂橘子的位置,dx, dy 表示相邻四个方向的相对距离。
  4. minute 表示持续时间。腐烂橘子扩散污染新鲜橘子时,minute 要在这个层面上加 1,将这个时间作为这个层面变为腐烂橘子的持续时间,入队到 queue
  5. 根据题意,当队列为空时,还需检测矩阵网格中是否还存在新鲜橘子:若有,返回 -1;否则返回 minute。

代码实现


class Solution:
    def orangesRotting(self, grid: List[List[int]]) -> int:
        row, col, minute = len(grid), len(grid[0]), 0
        directions = [(0, -1), (1, 0), (0, 1), (-1, 0)]

        queue = []

        for x in range(row):
            for y in range(col):
                if grid[x][y] == 2:
                    queue.append((x, y, minute))

        while queue:
            x, y, minute = queue.pop(0)
            for dx, dy in directions:
                if 0 <= x + dx < row and 0 <= y + dy < col and grid[x + dx][y + dy] == 1:
                    grid[x + dx][y + dy] = 2
                    queue.append((x + dx, y + dy, minute + 1))
        
        for row in grid:
            if 1 in row:
                return -1

        return minute

实现结果


LeetCode 腐烂的橘子_第1张图片


以上就是使用广度优先搜索 + 队列,解决《腐烂的橘子》问题的主要内容。

欢迎关注微信公众号《书所集录》

你可能感兴趣的:(python,leetcode,广度优先搜索,队列)