前面介绍广度优先算法的时候提及了多次走迷宫,我们就真正的走一次迷宫试试!

要求如下:

输入给出迷宫矩阵的行数和列数,并给出迷宫(使用点 (.) 表示路,使用星 (*) 表示障碍物,使用S表示起点,T表示终点)

例如:

5 5

.    .    .   .    .

.   *  .  *   .

.    *  S *   .

.   *   *   * .

.    .    .   T   *

输出最短路径的长度。上面的例子中,路线使用原谅绿来表示,长度为11。

根据BFS算法可以很轻松的写出这个程序:

#include

#include

using namespace std;

int m, n;

/*表示坐标的结构*/

typedef struct{

int x, y;

} point;

point start, endp;   //起点和终点

/*表示地图上每个点的结构。is_ob表示是不是障碍物(*),

is_checked表示是否检查过该点,step为起点到这一点最少步数*/

typedef struct{

bool is_ob, is_checked;

int step;

} node;

/*map:全局地图*/

node map[100][100];

/*裁定函数,越界返回假,检查过(is_checked==true)返回假,是障碍物(is_ob==true)返回假*/

bool judge(int x, int y){

if(x >= n || x = m || y

return !(map[x][y].is_checked) && !(map[x][y].is_ob);

}

/*偏移量*/

int X[] = {1, -1, 0, 0}, Y[] = {0, 0, -1, 1};

/*广度优先算法*/

int BFS(int x, int y){

/*到终点的最少步数*/

int result = 0;

queue Q;

point P;

P.x = x, P.y = y;

Q.push(P);

map[x][y].is_checked = true;

int top_step = 0;

while(!Q.empty()){

point top = Q.front();

Q.pop();

if(top.x == endp.x && top.y == endp.y)  //是终点,返回步数

return top_step;

for(int i = 0; i

top_step = map[top.x][top.y].step;

int newX = top.x + X[i], newY = top.y + Y[i];

//printf("队首(%d,%d),正在检查(%d,%d)",top);

if(judge(newX, newY)){

map[newX][newY].step = top_step + 1;

P.x = newX, P.y = newY;

Q.push(P);

map[newX][newY].is_checked = true;

}

}

}

}

int main(){

cin >> n >> m;

char c;

for(int y = 0; y

for(int x = 0; x

cin >> c;   //读入该点

if(c == '*'){    //是障碍物

map[x][y].is_ob = true;

map[x][y].is_checked = false;

}else{  //不是障碍物

map[x][y].is_ob = false;

map[x][y].is_checked = false;

}

if(c == 'S')    //起点

start.x = x, start.y = y;

if(c == 'T')    //终点

endp.x = x, endp.y = y;

map[x][y].step = 0;

}

cout <

return 0;

}

运行结果:

  

c语言bfs算法走迷宫,使用广度优先算法(BFS)走迷宫相关推荐

  1. 算法简介:层层递进----广度优先搜索(BFS)

    算法简介:层层递进----广度优先搜索(BFS) 算法简介 算法简介 BFS算法思想: 首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的 ...

  2. Java数据结构之图的基本概念和算法,深度优先遍历DFS,广度优先遍历BFS(图解)

    文章目录 前言 一.图的基本概念 1.图的定义 2.基本术语 二.图的基本算法 1.初始化图 2.插入顶点和边 3.矩阵打印 4.返回第一个邻接结点的下标 5.返回第一个邻接结点的下一个结点的下标 三 ...

  3. 算法之深度优先、广度优先算法

    目录 前言: 搜索算法: 广度优先搜索算法 深度优先搜索算法 问题:如何找出社交网络中某个用户的三度好友关系? 总结: 参考资料: 前言: 图这种数据结构经常用于表示一个社交网络,在社交网络中有一个六 ...

  4. 应对笔试手写代码,如何准备深度优先算法 广度优先算法?

    应对笔试手写代码,如何准备深度优先算法 & 广度优先算法? 1. 什么是深度优先算法?什么又是广度优先算法? 2. 广度优先算法使用场景 3. 广度优先算法模板 4. 深度优先算法使用场景 5 ...

  5. python爬虫算法深度优先_爬虫课程(四)|深度优先和广度优先算法

    深度优先和广度优先算法在爬取一个整站上经常用到,本课程主要讲解这两个算法的原理以及使用过程. 一.网站的树结构 1.1.一个网站的url结构图 以知乎为例,知乎目前有发现.话题.Live.书店.圆桌. ...

  6. 浅谈网络爬虫中广度优先算法和代码实现

    前几天给大家分享了网络爬虫中深度优先算法的介绍及其代码实现过程,没来得及上车的小伙伴们可以戳这篇文章--浅谈网络爬虫中深度优先算法和简单代码实现.今天小编给大家分享网络爬虫中广度优先算法的介绍及其代码 ...

  7. 重排九宫(广度优先算法)

    重排九宫问题 问题描述 算法描述 实验结果 主要代码 改进建议 问题描述 重排九宫问题:在 3*3 的方格棋盘上放置分别标有数字 1,2,3,4,5,6,7,8 的 8 张牌,初始状态为 s_0,目标 ...

  8. 浅谈网络爬虫中广度优先算法和深度优先算法

    前言 做爬虫的,最怕业务简单粗暴的来一句"爬一下XXXX网".比如,"爬一下央广网"(示例链接:http://www.cnr.cn),看着密密麻麻的各种子分类, ...

  9. 广度优先算法和深度优先算法-树形结构(层级结构)-Java

    广度优先算法和深度优先算法-树形结构(层级结构)-Java 目录 文章目录 1.前言 2.递归 3.栈+深度优先算法 4.队列+广度优先算法 5.比较 ***后记*** : 内容 1.前言 在日常应用 ...

最新文章

  1. SpringMVC @Transactional的陷井大坑引发No Session found for current thread
  2. Scott Mitchell 的ASP.NET 2.0数据教程之五:: 声明参数
  3. python Web抓取(一)[没写完]
  4. Mysql(三)——(cmd)数据库的命令操作
  5. Linux 启动流程学习
  6. shop--6.店铺注册--店铺注册之Service层的实现
  7. 你真的会调试 Linux 内核故障吗,看完这一篇后你会茅塞顿开的!
  8. layui动态设置checkbox选中状态
  9. ISO19000-2000标准(转载)
  10. 游戏数据库 mysql_网络游戏_数据库查询
  11. MFC关于*.rc和resource.h文件的巧妙运用
  12. linux状态栏显示命令,Ubuntu状态栏显示网速CPU
  13. USB RNDIS实现
  14. 他司四大名著(zz)
  15. 浮世三千,吾爱有三。日,月与卿。日为朝,月为暮,卿为朝朝暮暮。...
  16. Android程序员如何高薪接私活?十年老炮告诉你,看这一篇就够了
  17. Python自然语言处理—提取词干
  18. VirtualBox安装出现严重错误
  19. 按键精灵--------后台插件
  20. 港科科研|香港科大邵敏华教授带领团队研发全球最耐久的氢燃料电池有助推动绿色能源普及化...

热门文章

  1. CUP发卡机构(POS收单行)代码表
  2. xssgame第九关至第十关
  3. 报错:TypeError: Image data of dtype object cannot be converted to float
  4. 硬盘的读写原理(图文详解)
  5. 苹果开发者账号和证书那些事
  6. 移动端:苹果开发者账号Apple Developer Program
  7. QT 交叉编译 ARM / CSKY
  8. 记一次在咸鱼上购买MacBook Pro的经历
  9. 5.2 lilyglyphs包
  10. 独立IP、特产浏览量(PV)、访问次数(VV)、独立访客(UV)有什么区别?