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

要求如下:

输入给出迷宫矩阵的行数和列数,并给出迷宫(使用点 (.) 表示路,使用星 (*) 表示障碍物,使用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. 迭代是人,递归是神(迭代与递归的总结:比较)
  2. R----plotly包介绍学习
  3. 电脑不能访问服务器指定端口6,windows server2008 无法访问本机及其他服务器的所有端口...
  4. 11. Leetcode 713. 乘积小于K的子数组 (数组-同向双指针-滑动窗口)
  5. 改写Unity DropDown 支持多次点击同一选项均回调
  6. matlab计算斜方差_Matlab求方差,均值,均方差,协方差的函数
  7. 计蒜客挑战难题:A+B+C问题
  8. CDialog::OnOk()作用
  9. Multi-Armed Bandit--基于时变多臂老虎机的在线上下文感知推荐
  10. 在vb中使用Iphlpapi.dll获取网络信息(上)
  11. 正在搜索需要的文件_搜索电脑文件,只需要0.01s
  12. 安卓库-图表库: MPChartView
  13. 软件开发模型、瀑布模型、V模型、原型模型、增量模型、螺旋模型、喷泉模型
  14. windows 一键切换ip dns脚本
  15. 新的深度学习模型可以准确识别睡眠阶段
  16. Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Netw
  17. 【仿写网站】用swiper实现故宫博物院首页轮播图
  18. php 读取rtf文件,rtf是什么格式?
  19. MP4文件格式的相关内容
  20. Autosar CPU core trust/Nontrust配置

热门文章

  1. zookeeper原理:分布式协同技术
  2. 2011考研数学二第(11)题——第一类曲线积分球弧长
  3. 课堂笔记(常用软件,网站资源)
  4. HackerRank Truck Tour
  5. 【原创】群晖 Synology DS920+ 开箱及安装过程
  6. VFS(virtual File System) 虚拟文件系统
  7. 数值分析12 - Hermite埃尔米特插值法(要求高阶插值误差足够小)
  8. mysql中两根竖线什么意思_五线谱中两根竖线是什么意思?
  9. 【软件架构】Michael Perry关于不可变架构、CAP定理和CRDTs
  10. 站在巨人的肩膀上,用Node+ChatGPT模块实现一个接口