适用情况
给定初始状态跟目标状态,要求从初始状态到目标状态的最短路径。
模式
<1.建立列表,插入节点>
queue = []
queue.append([node])
depth = 0
<2.循环遍历节点>
while queue: 满足什么条件停止遍历
depth += 1
<逐层遍历>这一步只有在需要计算depth时才需要,表示循环遍历完一层
for i in range(len(queue)):
<3.取出节点>
node = queue.pop(0)
<4 插入下一层节点>通常要设置条件,插入节点或return false停止循环
queue.append()
解决思路
- 广度优先的判断关键是什么时候不满足条件了就退出,如果满足条件就继续在while循环里面循环,只到所有节点循环完
记住这张图
例题一
leetcode 994 (easy) 腐烂的橘子
在给定的网格中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。
输入:[[2,1,1],[1,1,0],[0,1,1]]
输出:4
解题思路:
- 可以设置腐蚀,但是不知道怎么找最短?已知速度求最短时间,即求最短路径,用广度优先。把一层内的所有节点遍历一遍,得到的结果是下一层的节点,然后再循环
- 注意观察怎么把思路用代码实现,怎么满足同时感染?判断是否同时感染的关键是计时点,遍历完当前层内的所有橘子并进行感染,然后时间再加1,就实现了同时感染
def orangesRotting(grid):
time = 0
row = len(grid)
col = len(grid[0])
count = 0
# <1.建立列表>
rotten = []
for i in range(row):
for j in range(col):
if grid[i][j] == 2:
rotten.append([i,j])
elif grid[i][j] == 1:
count +=