今天去做了几道bfs的板子题。总结了一些基本的东西。大佬勿喷
bfs原理
宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。(来自百度百科)
特点
bfs是一种发散性搜索,不能直接记录路径。(如果记录的话,可能会记录多条路径,且记录路径的数组大到你无法想象)它最主要的用法是用于找某种东西的距离,或者是某种状态。例如斐波那契数列 1-n
应该怎么找
首先确定四分点或八分点。重点:扫描完后判定下是否是正确答案
判定条件:
1.必须合法;
2.必须可达;
3.最先得到的一定是步数最少的解;
4.bfs得到步数时,(步数-1)的状态已经被全部搜索到了;
5.最优解:搜一遍如果找到就break或return;
如果要都搜一遍判定队列为空停止;
队列的编写:
注意。要么使用语言里面自带的结构。
要么自己手写一个循环队列。
为了让大家了解得更加透彻,上个图
上面的两个分别是八分点和四分点查找的样图。
从红色点开始向外找,找的时候要有优先级。先找最近的
宽度优先。越近越优先去搜。但是通常是用队列来存储。
特点
先扫红色再扫黄色
如果红色弹出队列以后
所有橙色的都加入队列
如果橙色弹出队列以后
所有黄色都加入队列…
下面是伪代码:
bfs
当队列不是空
判定左边的红色方框(L)
如果他是答案就返回或输出
找到所有可以找到的范围(未找过,合法)
将分支点放入队列
所有点放入之后就弹出
end
end
代码的话就先不写。等我琢磨下在放上去。