美文网首页
994.腐烂的橘子

994.腐烂的橘子

作者: 等不了天明等时光 | 来源:发表于2020-03-17 12:49 被阅读0次

由题目我们可以知道每分钟每个腐烂的橘子都会使上下左右相邻的新鲜橘子腐烂,这其实是一个模拟广度优先搜索的过程。所谓广度优先搜索,就是从起点出发,每次都尝试访问同一层的节点,如果同一层都访问完了,再访问下一层,最后广度优先搜索找到的路径就是从起点开始的最短合法路径。
BFS 可以看成是层序遍历。从某个结点出发,BFS 首先遍历到距离为 1 的结点,然后是距离为 2、3、4…… 的结点。因此,BFS 可以用来求最短路径问题。BFS 先搜索到的结点,一定是距离最近的结点。

如何写(最短路径的) BFS 代码
我们都知道 BFS 需要使用队列,代码框架是这样子的(伪代码):

while queue 非空:
    node = queue.pop()
    for node 的所有相邻结点 m:
        if m 未访问过:
            queue.push(m)

但是用 BFS 来求最短路径的话,这个队列中第 1 层和第 2 层的结点会紧挨在一起,无法区分。因此,我们需要稍微修改一下代码,在每一层遍历开始前,记录队列中的结点数量 n ,然后一口气处理完这一层的 n 个结点。代码框架是这样的:

depth = 0 # 记录遍历到第几层
while queue 非空:
    depth++
    n = queue 中的元素个数
    循环 n 次:
        node = queue.pop()
        for node 的所有相邻结点 m:
            if m 未访问过:
                queue.push(m)

本题步骤:
1)记录行数与列数,初始化队列、时间;
2)找出初始时就已经腐烂了的橘子,将它们入队;
3)当队列不为空时进行循环,执行BFS遍历,找出每个烂橘子上下左右相邻的新鲜橘子,这里需判断边界情况,并将它们依次入队,时间加1;
4)由于可能存在无法被污染的橘子,我们需要记录新鲜橘子的数量。在 BFS 中,每遍历到一个橘子(污染了一个橘子),就将新鲜橘子的数量减一。如果 BFS 结束后这个数量仍未减为零,说明存在无法被污染的橘子。

class Solution:
    def orangesRotting(self, grid: List[List[int]]) -> int:
        # 初始化
        rows = len(grid)
        cols = len(grid[0])
        time = 0
        directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] #上、下、左、右
        queue = []
        # 找出一开始就已经腐烂了的橘子
        for i in range(rows):
            for j in range(cols):
                if grid[i][j] == 2:
                    queue.append([i,j,time])
        # BFS遍历
        while queue:
            i, j, time = queue.pop(0)
            for di, dj in directions:
                if 0 <= i + di < rows and 0 <= j + dj < cols and grid[i + di][j + dj] == 1:
                    grid[i + di][j + dj] = 2
                    queue.append([i + di, j + dj, time + 1])

        # 判断是否存在无法被污染的橘子
        for row in grid:
            if 1 in row:
                return -1
        return time

相关文章

  • 994.腐烂的橘子

    原题 https://leetcode-cn.com/problems/rotting-oranges/ 解题思路...

  • 994.腐烂的橘子

    由题目我们可以知道每分钟每个腐烂的橘子都会使上下左右相邻的新鲜橘子腐烂,这其实是一个模拟广度优先搜索的过程。所谓广...

  • queue:994.腐烂的橘子

    考点:队列 动态的遍历queue 遍历queue的同时会追加元素 广度优先搜索算法

  • LeetCode 994. 腐烂的橘子

    在给定的网格中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂...

  • Leetcode 994. 腐烂的橘子

    题目描述 在给定的网格中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2...

  • 994. 腐烂的橘子(Python)

    难度:★★★☆☆类型:数组方法:宽度优先搜索,队列 题目 力扣链接请移步本题传送门[https://leetcod...

  • 994. 腐烂的橘子-广度优先搜索BFS

    题目:https://leetcode-cn.com/problems/rotting-oranges/ 我的方法...

  • 腐烂的橘子

    题目: 题目的理解: 分几个小步骤思考: 1. 网格中是否还有正常的橘子。 2. 网格中坏橘子的位置。 3. 怀橘...

  • 542. 01 矩阵、1162. 地图分析、994. 腐烂的橘子

    本次的三道题都用了多源点BFS的方法,关于什么是多源点BFS呢,就是求很多个起点到一个终点的关系,就将终点入队,反...

  • 正在慢慢腐烂的橘子

    把一个稍腐烂的橘子包上华丽的包装 放在冰箱里 你看不见它还在慢慢腐烂的身体 却暗自欣赏它上了包装的外边

网友评论

      本文标题:994.腐烂的橘子

      本文链接:https://www.haomeiwen.com/subject/wmftyhtx.html