994. 腐烂的橘子

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

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

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

 

示例 1:

 

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

思路:bfs 遍历来处理,但是处理的时候需要注意这个是个 多源的,即 坏的橘子可能有好几个,可以把这些坏的橘子都当做第一层的结点。

 

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

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

 

 

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

 

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

 

posted @ 2020-03-06 23:51  爱简单的Paul  阅读(249)  评论(0编辑  收藏  举报