> 注:本人语文不好,所以语句可能会不通顺。我本次是给新手为BFS打上基础的,并没有拓展,谢谢
> 本次肝了大概4小时左右,且分了3次写
众所周知,发一篇帖子需要头图
> 这里是我们毕业群里的图片
我们先用一道题作为本次文章的引导
A83422.幅優先探索
这道题的答案是这样的:
没错,这就是广度优先搜索(BFS)
什么是广度优先搜索(BFS)
首先,我们认识一下BFS是什么
这个算法是从起点到终点的最短距离
E.G
⏰不好不好,上学要迟到了!现在即将要到校的你,也即将要迟到,刚好,你有一块可以查看在现在的位置上于学校所有(不包括特别长)路径,手表上显示了:
> S表示start,意思是开始
> F表示finish,表示结束
> .表示可行走路径
> #表示不可行走路径
“想啥了?当然一直往前跑啊!”
没错,假若你选另一条到的话,那么你一定到学校后被狠狠骂一顿,然后罚站【doge】
当然,如果你仔细看(?),你会发现刚才说的一直往前跑的那条路就是最短的那条路,既省时,又省力
好了,我们回归主题,接下来,我们将拆解这道题目的答案,然后一 一讲一下
START😂
首先我们来看这段代码:
这里的n m分别指这个迷宫的长和宽,而sx sy是指起始位置,而这里的gx gy是终点位置
char a[55][55];是指这个迷宫的"地图"
最后一行int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};,这一行现在看起来好像不知道是什么作用,不过先让子弹飞一会儿,我们接下来看后面一段:
这里用了struct类型结构,为了方便表示位置和步数,直接用node里的坐标和步数就行了
再看下一段:
我们先创造一个队列q,类型node
再接着,我们把起始位置和起始步数加入队列,接着把没有走过的路径把它标称走过的路径
再来看个大部分
好的,现在我们需要图讲述这大块的代码了
我们再拆几部分
PART 1
我们现在看这张图:
> 为了表示方便,我们将横轴为xxx,数轴为yyy,位置表示(x,y)(x,y)(x,y)
> 所有的墙,都表示为#(图中和文字表示)
我们假设(7,1)(7,1)(7,1)是起点,(7,3)(7,3)(7,3)是终点
以之前的
现在,qqq里的队列是:
再回来看,现在now的值是
到第二行后,qqq为空队列
PART 2
这个判断条件是指我们是否在终点,如果是,输出最短步数,退出此函数[1]
因为在条件语句里的意思是:
PART 3
这里是对于后面走的路线的情况
之前我说的先让子弹飞一会儿就在这里"停止"了
这里是探查下一步路径的作用
现在,我们再次回到之前的代码块
dx管理的是左右探查路径
而dy则是上下探查路径
例如,我们还是以之前的图片的位置(7,1)(7,1)(7,1)
现在在探查下一步左右路径(如图),但这个时候有人会说:
探查右的话这里就出地图边界了
没错,所以再看这一块
这里的nx<0指的是出地图左边界,而nx>n+1是出地图右边界
ny<0是指出地图上边界,ny>m+1是指出地图下边界
现在,我们将这些情况合并起来,就是这里万万不可出现的情况
所以,这里使用continue是为了防止继续执行下去,否则要丸辣
> 现在大家看到这里小部分可能一脸疑惑❓
>
>
> 如果边界出了,有什么严重?
>
> 以后nx和ny会被当下标使用,而后面可能会RE(runtime error,指运行时错误,与编译错误(CE)不同)
PART 4
这里是一个路径判断,指的是
是否有墙?是走过的路径吗?
因为墙视为不可行走路,而走走过路径的话那将可能是到处乱逛,所以也是排除在外的情况
PART 5
成功后,这里将为路过路径,且进入q队列
运行
以本张图片为例
假设起点为(7,1)(7,1)(7,1),终点为{7,3)
接着探查路径,发现
只有一个方向可走,这时候,q队列为
再次继续探查,发现
有两条路径可走,这时候,q队列为
以此类推,直到
后结束,
最后最短步数为4
我们再来看一道题:
A8046.仙岛求药
虽然在起点和终点进行了一些标志,让自己去找起点和终点,不过还是套模板就行了
THANKS
我在次必须要谢谢Deepseek人工智能AI,我为了这篇文章,问了他很多问题,他每次都会耐心的回复我,曾经我自学BFS的时候我就是投一个题目,跟他慢慢去解析,我因此也会了最基础的BFS,后面,我也产生了许多问题,后面,我也慢慢理解了
我们因此要怀着不懂就问的心态,去做很多事情
在此,向Deepseek\color{blue}{Deepseek}Deepseek致谢
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 代码在函数BFS(void类型)里 ↩︎