迷宫问题是一个经典的bfs问题,bfs相比于dfs,代码的实现上较为复杂,因此迷宫问题对于初学者而言是有一定难度的。而在这里,笔者将对迷宫问题做出比较详细的解释。

由于本篇博客侧重于对迷宫问题的讲解,所以对于一些其它概念将做一些省略,在看本篇博客前你需要掌握:

1、BFS的基本概念与思路
2、数据类型queue的概念与使用方法
3、pair的使用方法
4、memset函数的使用方法

如果对上面4点知识点还有不了解的地方,可以先点个收藏,然后在了解相关知识点后再来看本篇博客。(要回来哦)

上题目!!!!
(附上oj地址:献给阿尔吉侬的花束)

阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫。今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪。现在研究员们想知道,如果阿尔吉侬足够聪明,它最少需要多少时间就能吃到奶酪。迷宫用一个 R×C 的字符矩阵来表示。字符 S 表示阿尔吉侬所在的位置,字符 E 表示奶酪所在的位置,字符 # 表示墙壁,字符 . 表示可以通行。阿尔吉侬在 1 个单位时间内可以从当前的位置走到它上下左右四个方向上的任意一个位置,但不能走出地图边界。输入格式
第一行是一个正整数 T,表示一共有 T 组数据。每一组数据的第一行包含了两个用空格分开的正整数 R 和 C,表示地图是一个 R×C 的矩阵。接下来的 R 行描述了地图的具体内容,每一行包含了 C 个字符。字符含义如题目描述中所述。保证有且仅有一个 S 和 E。输出格式
对于每一组数据,输出阿尔吉侬吃到奶酪的最少单位时间。若阿尔吉侬无法吃到奶酪,则输出“oop!”(只输出引号里面的内容,不输出引号)。每组数据的输出结果占一行。数据范围
1<T≤10,
2≤R,C≤200

输入样例

3
3 4
.S..
###.
..E.
3 4
.S..
.E..
....
3 4
.S..
####
..E.

输出

5
1
oop!

在理解了题目后,让我们来看看代码的逐句分析
在这里提醒,代码的理解难度在于对pair的不理解导致first,second无法理解以及对于bfs搜索pop与push数据的时机与条件的把握无法理解,

#include<iostream>
#include<queue>  //bfs需要用到用到队列
#include<cstring>  //下方memset函数需要用到
using namespace std;
typedef pair<int, int>pii;  //把pair的定义方式简化,pair代表一个点坐标,pii作用就像int,代表pair数据类型(pair.first,pair.second)
const int N = 210;
char a[N][N];  //用于储存迷宫
int dis[N][N];  //用于记录从起点到这个点的最短距离
void bfs(pii start)  //bfs函数的实现,需要把起点作为形参数输入
{queue<pii> q;  //定义一个pair类型的队列,每个pair的first和second代表a[first][second]q.push(start);  //先把起点push进队列while (!q.empty())  //开始广度优先搜索{pii u = q.front();  //定义一个临时变量存下队列的第一个pairq.pop();  //把队列的第一个数删除int dx[4] = { -1,0,1,0 };int dy[4] = { 0,1,0,-1 };for (int i = 0; i < 4; i++) //借用dx和dy来访问a[u.first][u.second]上下左右的四个点{/*这里用4次循环,借x与y来访问a[u.first][u.second]上下左右4个点*/int x = u.first + dx[i];int y = u.second + dy[i];if (a[x][y] == '#') //遇到墙就返回continue;if (a[x][y] == '.')  //如果不是墙{dis[x][y] = dis[u.first][u.second]+1;  //记录下从起点到a[x][y]的最小步数a[x][y] = '#';  //代表这个点已经被记录了,q.push({ x,y });  //把这个(x,y)点push进队列,用来等会搜索这个点上下左右的4个点}if (a[x][y] == 'E')  //搜索到E就代表找到了终点,结束搜索{cout << dis[u.first][u.second] + 1 << endl;  //输出从起点到这个点的最小步数return;  //结束bfs函数}}}cout << "opp!" << endl;  //如果直到队列为空都没有找到E,就说明迷宫无解
}
int main()
{int t;cin >>t ;while (t--){memset(a, '#', sizeof(a));  //迷宫的每个点初始化为#memset(dis, 0, sizeof(dis));  //把距离数组的每一个值初始化为0int n, m;pii start;  //定义起点cin >> n >> m;for(int i=1;i<=n;i++)for (int j = 1; j <= m; j++){cin >> a[i][j];if (a[i][j] == 'S')  //寻找起点,记录下起点start.first = i, start.second = j;}bfs(start);  //代入起点调用bfs函数}return 0;
}

到这里,迷宫问题的解析就结束了,很简单吧?( 你胡说 )

作者:Avalon Demerzel,是个正在不断努力学习的小白,如果觉得博客不错,就来个三连吧(点个赞也行)。让我们一起进步。

【BFS】迷宫问题c++代码详解(逐句分析)相关推荐

  1. 7-20 表达式转换 (25 分)(代码详解+题目分析)

    一:题目 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间.请设计程序将中缀表达式转换为后缀表达式. 输入格式: 输入在一行中 ...

  2. python自动寻路算法_PHP生成迷宫及自动寻路算法详解

    如何使用PHP生成迷宫以及寻路求解?本文主要介绍了PHP生成迷宫及自动寻路算法,并对PHP生成迷宫及自动寻路算法详解.希望对大家有所帮助. 本文实例讲述了PHP树的深度编历生成迷宫及A*自动寻路算法. ...

  3. 【CV】Pytorch一小时入门教程-代码详解

    目录 一.关键部分代码分解 1.定义网络 2.损失函数(代价函数) 3.更新权值 二.训练完整的分类器 1.数据处理 2. 训练模型(代码详解) CPU训练 GPU训练 CPU版本与GPU版本代码区别 ...

  4. html5代码转换为视频,HTML5中的视频代码详解

    摘要 腾兴网为您分享:HTML5中的视频代码详解,智学网,云闪付,易推广,小红书等软件知识,以及360win10,流量魔盒,fitbit,上港商城,安卓2.3.7,全民惠,五年级下册英语单词表图片,t ...

  5. js php base64,JavaScript实现Base64编码与解码的代码详解

    本篇文章给大家分享的是jJavaScript实现Base64编码与解码的代码详解,内容挺不错的,希望可以帮助到有需要的朋友 一.加密解密方法使用//1.加密 var str = '124中文内容'; ...

  6. yii mysql 事务处理_Yii2中事务的使用实例代码详解

    前言 一般我们做业务逻辑,都不会仅仅关联一个数据表,所以,会面临事务问题. 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全 ...

  7. 代码详解|tensorflow实现 聊天AI--PigPig养成记(1)

    Chapter1.代码详解 完整代码github链接,Untitled.ipynb文件内. [里面的测试是还没训练完的时候测试的,今晚会更新训练完成后的测试结果] 修复了网上一些代码的bug,解决了由 ...

  8. vue build text html,Vue中v-text / v-HTML使用实例代码详解_放手_前端开发者

    废话少说,代码如下所述: /p> 显示123 /p> 补充:vuejs {{}},v-text 和 v-html的区别 {{message}} let app = new Vue({ el ...

  9. sift计算描述子代码详解_代码详解——如何计算横向误差?

    在路径跟踪控制的论文中,我们常会看到判断精确性的指标,即横向误差和航向误差,那么横向误差和航向误差如何获得? 在前几期代码详解中,参考路径和实际轨迹均由To Workspace模块导出,如图所示: 那 ...

  10. 委托与事件代码详解与(Object sender,EventArgs e)详解

    委托与事件代码详解 using System; using System.Collections.Generic; using System.Text; namespace @Delegate //自 ...

最新文章

  1. (每日一题)P3768 简单的数学题(确信)(莫反 + 欧拉反演 + 杜教筛 )
  2. 感知器 Perceptron
  3. laravel5.8笔记一:安装与服务器环境配置
  4. MyBatis之八:需要说明的几个java api的生命周期以及封装
  5. 第七十四期:国内SaaS企业终于活成了自己讨厌的样子!
  6. python打印字符串全排列_【算法15】字符串的全排列
  7. kaggle实战笔记_1.数据处理
  8. 函数指针实现无类型打印
  9. interlib系统服务器,Interlib图书馆集群管理系统
  10. 【GD32F303开发之开发工具的安装与配置】
  11. [读书笔记] 有效竞品分析
  12. spark快速入门java_Spark 快速入门
  13. Python计算流体动力学(CFD)模拟人体呼吸系统
  14. PR片头片尾模板 蝴蝶飞舞动态粒子爆炸效果logo展示pr视频模板
  15. c语言中isupper用法,C语言中的isupper()函数
  16. 后台批量刷新金蝶K3物料名称操作步骤
  17. java毕业设计学生学习评价系统Mybatis+系统+数据库+调试部署
  18. 风行天下!翔升N61S智能主板低价上市
  19. 让旧Mac免费获得 iWork 套件的秘籍
  20. iOS 上的插件化设计

热门文章

  1. BZOJ3457 : Ring
  2. Java基础-运行原理及变量(01)
  3. java序列化和反序列话总结
  4. 10个线程同时执行i++操作1000次,如何保证结果是1w
  5. 难道我们就是那0.0000001%
  6. 戴尔DCS两周年庆 推新型数据中心设备
  7. 自定义吐司Toast小进阶
  8. 处理MySql连接超时引起的错误
  9. DataGridView分页
  10. Quick-Cocos2d-x初学者游戏教程(五) --------------------- 辅助工具和跳转场景