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)