广度优先搜索
BFS
 
广度优先搜索的搜索过程有点像一层一层地进行遍历,每层遍历都以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点。需要注意的是,遍历过的节点不能再次被遍历。
第一层
- 0 -> {6,2,1,5};
第二层
- 6 -> {4}
- 2 -> {}
- 1 -> {}
- 5 -> {3}
第三层
- 4 -> {}
- 3 -> {}
可以看到,每一层遍历的节点都与根节点距离相同。设 di 表示第 i 个节点与根节点的距离,推导出一个结论: 对于先遍历的节点 i 与后遍历的节点 j,有 di<=dj。利用这个结论,可以求解最短路径等 最优解 问题: 第一次遍历到目的节点,其所经过的路径为最短路径。应该注意的是,使用 BFS 只能求解无权图的最短路径。
在程序实现 BFS 时需要考虑以下问题:
- 队列: 用来存储每一轮遍历得到的节点;
- 标记: 对于遍历过的节点,应该将它标记,防止重复遍历。
迷宫问题
题目描述:有一个 n * m 的迷宫,求从迷宫左上角到右下角的最短路径。
| 1 | 1 1 0 1 | 
解决
一层一层进行枚举(按照上右下左的方向)
- 第一层- [0,0]->{[0,1],[1,0]}
 
- 第二层- [0,1]->{[1,1]}
- [1,0]->{}
 
- 第三层- [1,1]->{[2,1]}
 
- 第四层- [2,1]->{[2,2],[3,1]}
 
- 第五层- [2,2]->{[3,2]}
- [3,1]->{[3,0]}
 
- 第六层- [3,2]->{[3,3]} -end
- [3,0]->{}
 
| 1 | public class BFSTest { |