C.广搜(BFS)打印路径的代码实现

本文介绍了使用广度优先搜索(BFS)算法解决迷宫问题,通过队列实现搜索,并详细阐述了如何打印从起点到终点的最短路径。在BFS过程中,结构体数组用于存储队列,通过递归方式回溯路径。
摘要由CSDN通过智能技术生成

简介

广度优先搜索算法(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);
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值