简介
广度优先搜索算法(Breadth-First Search,BFS)是一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,以起点为中心彻底地搜索整张图,每个点只访问一次,直到找到结果为止。
以解决迷宫问题为例,广度优先搜索的思路是:利用队列先进先出的性质,从起点开始,将一步能到达的点枚举出来,把其中可访问的点全部存入队列(超出迷宫边界/遇到障碍/已经访问过 都视为不可访问),然后将队列中队首元素出队,执行与起点相同的操作,以此循环,直到到达终点或者队列为空,一旦到达终点即说明此路为到达终点所经历步骤最少的一条路,队列为空说明可以到达的点都已经遍历过了,也就是说没有路可以到达终点。
由于需要打印路径,此处选用结构体数组来实现队列,对于无需打印路径的情况可直接运用队列
思路
定义一个结构体来实现队列
struct queue{
int x,y;//横、纵坐标
int step;//记录起点到达该点的步数,对于新入队的点,他的step值为父节点的step值加一
int f;//记录父节点在结构体中的位置
}q[3000];
int head=0,tail=0;//head表示正扩展的结点,tail位于队尾最后一个元素的后面,随时将head扩展出来的结点入队,head=tail表示队列为空
每执行一次入队tail++,每执行一次出队head++
以一个比较简单的图的广搜为例(这里枚举一步所能到达的点的顺序为上下左右)
起点入队,此时队列长这样。head表示正扩展的结点,tail位于队尾最后一个元素的后面随时将head扩展出来的结点入队
起点1向上无法访问,向下访问2(2入队),向左无法访问,向右访问3(3入队)。1的向外拓展完毕,出队
2向上无法访问,向下访问4(4入队),向左无法访问,向右访问5(5入队)。2的向外拓展完毕,出队
3向上无法访问,向下无法访问,向左无法访问,向右访问6(6入队)。3的向外拓展完毕,出队
4向上无法访问,向下无法访问,向左无法访问,向右访问7(7入队)。4的向外拓展完毕,出队
5向上无法访问,向下无法访问,向左无法访问,向右访问8(8入队)。5的向外拓展完毕,出队
接下来的6发现自己哪条路都走不通,也默默地跟着出队了
7向上无法访问,向下无法访问,向左无法访问,向右访问9(9入队),此时检测到9为终点,即找到了最短路径,中断搜索
对于步数,直接打印终点的step就好,而打印路径就需要思考一下了,这个不能边走边打印,只能走完了再回过头来打印,需要用到递归
void print(int a){
//打印路径的递归函数,a为终点在结构体数组中的位置,可以打印由起点到终点的路径
if(q[a].f>=0)print(q[a].f);