广度优先搜索解决迷宫问题

Posted C语言进阶学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了广度优先搜索解决迷宫问题相关的知识,希望对你有一定的参考价值。

学习难,

难在于当你处于学习过程时对自己的克制,

 编程亦是如此。


算法简介

 

广度优先搜索(Breadth-First Search,简称BFS)算法和深度优先搜索算法相差无几在《》我们知道,DFS的思想就是“打破砂锅问到底,不撞南墙不回头”。而BFS算法的思想则是,当给定一个点时,它会依次搜索这个点的周边,每搜索到某个点,就以这个点为中心向周边展开搜索,就像地毯式搜索一样,如下图所示。

同样地,在之前的《 》中我们也接触过,我们知道二叉树的遍历有以下几种:
    1. 先序遍历;
    2. 中序遍历;
    3. 后序遍历;
    4. 层序遍历。
其中前三种是深度优先搜索,层序遍历是广度优先搜索。请看代码:
/* * 层序遍历 */static void lev_order_tree(tree_p node) {
tree_p temp[100]; int front, rear; if ( node ) {
front = 0; rear = 1; temp[0] = node; while ( front < rear ) {
printf("%d ", temp[front]->value); if ( temp[front]->left ) {
temp[rear++] = temp[front]->left; } if ( temp[front]->right ) {
temp[rear++] = temp[front]->right; } front++; } }}

在二叉树的层序遍历中,使用到了队列来辅助。因为要逐层遍历,因此先将每一层的结点依次入队,然后根据出队顺序进行访问即可。


迷宫问题

 
同样地,我们用BFS来解决迷宫问题,这里就不重复了上代码了(关键代码和《 》一样),唯一不同的是,广度优先搜索算法采用的数据结构是 ,下面请看广度优先搜索的演示过程:

广度优先搜索解决迷宫问题

从视频中可以看出,在同一迷宫中,DFS的速度要快一点,当然这只是一种特殊情况而已,事实上DFS的效率要比BFS高,尤其随着距离和深度的增加,两者的效率差距越大。但是也能反应出来,BFS搜索的范围要比DFS广一些。这并不意味着DFS要比BFS好,根据不同的场景采用不同的算法。如果我们仔细分析,会发现BFS的一大优点,就是可以找出两点之间的最短距离,因为它是起点展开搜索,每个可以走通的方向轮流走一遍。


源码

 
作者是在深度优先搜索算法的基础上进行改修,当然也只需要实现一个简单的队列即可。只需要在“config.h”中定义“_DFS_”或者取消定义即可切换两种算法。

链接:https://pan.baidu.com/s/11_dfT-aeZgqENTONVCiN-A
提取码:s5vj




如果你有想学或者正在学习C语言的好友,长按二维码图即可分享。







也可以长按二维码图添加作者微信交流。



以上是关于广度优先搜索解决迷宫问题的主要内容,如果未能解决你的问题,请参考以下文章

迷宫问题 - 队列与广度优先搜索

广度优先搜索的应用

使用BFS(广度优先搜索)解迷宫类问题

迷宫问题的求解(广度优先搜索)

搜索算法---广度优先搜索

搜索算法---广度优先搜索