题目:

给定一个大小为N*M的迷宫,由通道('.')和墙壁('#')组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置。试求出起点到终点的最小步数。(本题假定迷宫是有解的)(N,M<=100)

样例输入:

10 10

样例输出:

22

这道题目以及解法均来自《挑战程序设计竞赛(第2版)》第34页-36页;

个人觉得这个例题很好地表现了广度优先搜索是如何与队列先进先出(FIFO)的思想联系起来的,通过不断取得某个状态后能够达到的所有状态并将其加入队列, 并且由于队列本身的特性先加入队列的状态总是先得到处理,这样就达到了一个目的:总是先将需要转移次数更少的状态进行分析处理,换句话说就是总是取得了这个状态的树中更接近根部的节点,又或者是总是让搜索树的广度得到尽可能增加。

/*********代码的建立过程**********/

在这个问题中,找到从起点到终点的最短路径其实就是一个建立队列的过程:

1.从起点开始,先将其加入队列,设置距离为0;

2.从队列首端取出位置,将从这个位置能够到达的位置加入队列,并且让这些位置的距离为上一个位置的距离加上1;

3.循环2直到将终点添加到队列中,这说明我们已经找到了路径;

注意到在这个过程中,每次处理的位置所对应的距离是严格递增的,因此一旦找到终点,当时的距离就是最短距离;

同样基于这个原因,搜索可移动到的位置所使用的判断条件中不仅仅是不碰墙壁、不超过边界,还有一个就是没有到达过,因为如果已经到达了这个位置,这说明已经有更短的路径到达这个位置,这次到达这个位置的路径是更差的,不可能得到更好的最终解。

代码:

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
typedef pair<int ,int> P;
const int inf=100000000;
int n,m;
char maze[110][110];
int sx,sy,gx,gy;
int dx[4]= {0,1,0,-1},dy[4]= {1,0,-1,0};
int d[110][110];
int bfs()
{
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
d[i][j]=inf;
queue<P> que;
que.push(P(sx,sy));
d[sx][sy]=0;
while(que.size())
{
P p=que.front();
que.pop();
if(p.first==gx&&p.second==gy) break;
for(int i=0; i<4; i++)
{
int nx=p.first+dx[i],ny=p.second+dy[i];
if(nx>=0&&nx<n&&ny>=0&&ny<m&&d[nx][ny]==inf&&maze[nx][ny]!='#')
d[nx][ny]=d[p.first][p.second]+1,que.push(P(nx,ny));
}
}
return d[gx][gy];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++)
scanf("%s",maze[i]);
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(maze[i][j]=='S')
sx=i,sy=j;
if(maze[i][j]=='G')
gx=i,gy=j;
}
int ans=bfs();
printf("%d\n",ans);
return 0;
}

关于书本的摘录:

(详细见ppt上面的广搜搜索过程)

1.先搜索距离初始状态近的状态;

2.复杂度为O(状态数×转移方式)

3.广搜运用了队列,搜索的时候首先将初始状态加入队列里,此后从队列的最前端取出状态,把从该状态可以转移到的且尚未访问过的部分加入队列,如此往复,直至队列被取空或找到了问题的解;

4.适用于找最短路径,最少操作数;

【搜索-广搜】 迷宫的最短路径相关推荐

  1. 搜索 —— 广搜的优化技巧

    [例题] 连连看(HDU-1175)(简单推导):点击这里 字串变换(洛谷-P1032)(string的使用):点击这里 非常可乐(HDU-1495)(三维BFS):点击这里 Mud Puddles( ...

  2. 算法之路——深搜、广搜(简单搜索)

    搜索 通过一定的顺序,枚举每一个数据(经常会通过一些判断条件去掉无意义的数据,即剪枝),找到想要的数据的过程. 深度优先搜索(dfs) 深度优先搜索属于图算法的一种,是一个针对图和树的算法,应为缩写为 ...

  3. 广搜(广度优先搜索BFS)

    广度优先搜索 广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果.换句话说,它并不考虑结果的可能位置 ...

  4. Poj_3984走迷宫(广搜)

    Description 定义一个二维数组: int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0 ...

  5. poj3984 迷宫问题 bfs 最短路 广搜

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27913   Accepted: 16091 Descriptio ...

  6. 深搜、广搜、搜索剪枝

    搜索与回溯讲解 文章目录 深搜 方向向量: DFS代码: 题目讲解: 八皇后问题 字符序列 自然数的拆分 广搜 BFS代码: 题目讲解: 瓷砖 关系网络 bfs与dfs的用途与区别 搜索剪枝 可行性剪 ...

  7. 蓝桥杯-学霸的迷宫-广搜-java

    算法提高 学霸的迷宫   时间限制:1.0s   内存限制:256.0MB 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面 ...

  8. BFS广搜解决迷宫问题java实现

    目录 1.例题 题目描述 输入 输出 测试数据 2. 思路分析 基本思想 具体步骤 代码实现 3.BFS小结 求解思路: 注意 1.例题 题目描述 迷宫由 n 行 m 列的单元格组成,每个单元格要么是 ...

  9. [数据结构] 迷宫问题(栈和队列,深搜和广搜)

    代码: #include <iostream> #include <string.h> #include <stack> #include <queue> ...

最新文章

  1. Ubuntu14.04 64位机上安装OpenCV2.4.13(CUDA8.0)版操作步骤
  2. sqoop增量导入hdfs和导出
  3. 无锡计算机硬件培训,无锡锡山办公软件电脑基础培训随到随学 学会为止
  4. linux基础期末考试免费,linux基础期末考试试题.doc
  5. 计算身份证号码的校验码Python
  6. win10重装,检测到硬盘错误:在MBR硬盘上没有找到可以引导的分区
  7. 如何赋能传统制造业数字化转型升级?
  8. 机器人布里茨哪个皮肤好看_LOL全英雄皮肤盘点推荐D32:蒸汽机器人布里茨 苹果机器人...
  9. 高考数学必考知识点高中数学重点知识归纳
  10. c语言黑底图片,用c语言把bmp格式的彩色图片转换成黑白的
  11. React 解决 “cross-cutting concerns” 问题
  12. 【Babel】1186- 保姆级教学!这次一定学会 Babel 插件开发!
  13. 内蒙农信携手星环科技建设农信大数据平台,激活金融业务创新
  14. 剑指offer_递归与循环---跳台阶
  15. 【自然语言处理】【对比学习】SimCSE:基于对比学习的句向量表示
  16. wordpress 更改域名搬家全攻略(转)
  17. Mldonkey的配置
  18. archlinux_安装篇
  19. 服务器能ping通,但用FinalShell连接不上
  20. Chrome浏览器如何完美实现滚动截图技巧

热门文章

  1. Mybatis学习第四天:Mybatis延迟加载懒加载,一级缓存,二级缓存,注解开发
  2. FTP文件传输服务器(详解)
  3. 怎样设定目标(三)——目标设定前的准备
  4. Fisher Discriminant
  5. [虚幻引擎][UE][UE5]在UE中画一个线框球,网格连接画球,高阶画球并操控
  6. 【Vue】vue2上传Excel表格到后台 实战教程(接上一篇下载Excel模板表格到本地)
  7. vue中wangEditor的使用及回显数据获取焦点
  8. Flink之Checkpoint
  9. oracle exadata celldisk 闪存盘受损导致性能下降
  10. 易效能:程序猿有哪些可以高效休息的方法?