bfs就是所谓的广度搜索( Breadth first search),这种算法旨在解决最优问题,如最小时间,最快路径之类的。实际上dfs(深度优先搜索)也是可以解决此类问题(这个可以参考下一篇),但是鉴于题目的空间和时间的限制,你不得不选择bfs(深搜同样也能解决最优问题,但是他是将所有的结果都找出来,那么时间上你已经gg了)

简单来说,这个算法就是将地图上能走的点走一遍,找出最优的解。步骤的话,就是创建2维数组,作为地图,然后找到起点和终点,从起点开始,输入每个点。然后进行判断。这个一点是不是符合要求,然后标记这个点已经走过了。

(为了明显区分两种算法的区别,我这里使用结构体的知识来完成这个算法)

关于这个算法,根据我上面所说,你可以分成4部分来完成。第一部分当然是最简单的读入地图

int a[100][100],v[100][100];//a是地图。v是标记地图有没有走过
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);

地图可能是字符也可能是数字(当然在这里i=0,i<n,也是可以的)
所以也可以这样输入(下面那个是解决字符串情况的)

scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s",a[i])

当然,如果,你不是很确定自己的地图输入是否有问题的话,你可以选择输出,去检测

然后 就是去寻找终点和起点,然后记录下来。当然,有些题目是会让你直接输入终点和起点的。。但是大部分还是要自己找。

            for(int i=0;i<n;i++)for(int j=0;j<m;j++){if(a[i][j]=='@'){startx=i;starty=j;}if(a[i][j]=='*'){p=i;q=j;a[i][j]='.';}}

这里有个细节就是,如果你找到终点的话,那么要将终点变成能走的地区,否则,你最后的步数会少1
因为,终点他是不会走的。(正常的代码都是找到终点后就直接结束,当然,你也可以选择在最后在加1上去。效果也是一样的)

然后就是最重要的dfs部分了。

struct point
{   int x;  int y;int step;};queue<point>r;//申请队列int dx[4]={0,1,0,-1};//顺时针右 下左上 int dy[4]={1,0,-1,0};

你要先定义结构体。dx和dy的话就作为方向。dfs的话要那么逆时针要么顺时针走,

point start;
start.x=startx;    //start是起点
start.y=starty;
start.step=0;
r.push(start);//入队
v[startx][starty]=1;int flag =0;//这个是用来判断能不能到终点的,如果能就是1
while(!r.empty())//如果队列不为空的话,那么久执行
{
int x=r.front().x;
int y=r.front().y;
if(x==p&&y==q)  {
flag=1;
printf("%d",r.front().step);  }       for(int k=0;k<=3;k++)//这里是3个方向,       {           int tx,ty;          tx=x+dx[k];           ty=y+dy[k];           if(a[tx][ty]==1&&v[tx][ty]==0)//是空地并且未访问            {               //入队                point temp;             temp.x=tx;             temp.y=ty;             temp.step=r.front().step+1;               r.push(temp);               v[tx][ty]=1;           }       }       r.pop();//出队 }  if(flag==0)   printf("no"); return 0;} 这里还要注意的就是,如果你是处理守卫问题的话(即打败一个守卫会花费1一个时间单位),会遇到一个问题,这是路程最短,
但不是时间最短。那么你需要在前面加一个判断,如果是是守卫的话,时间加1
,但是不标记守卫走过。然后将守卫变成能走的路即可完整的代码是这样的:
//这个代码旨在解决一个出口,一个起点,找到最小的路径的问题#include<bits/stdc++.h>
using namespace std;
int a[100][100],v[100][100];//a是地图。v是标记地图有没有走过
struct point
{int x;int y;int step;
};
queue<point>r;//申请队列
int dx[4]={0,1,0,-1};//顺时针右 下左上
int dy[4]={1,0,-1,0};
int main()
{int n,m,startx,starty,p,q;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&a[i][j]);scanf("%d%d%d%d",&startx,&starty,&p,&q);//bfspoint start;start.x=startx;start.y=starty;start.step=0;r.push(start);//入队 v[startx][starty]=1;int flag =0; while(!r.empty()){int x=r.front().x;int y=r.front().y;if(x==p&&y==q){flag=1;printf("%d",r.front().step);}for(int k=0;k<=3;k++){int tx,ty;tx=x+dx[k];ty=y+dy[k];if(a[tx][ty]==1&&v[tx][ty]==0)//是空地并且未访问 {//入队point temp;temp.x=tx;temp.y=ty;temp.step=r.front().step+1;r.push(temp);v[tx][ty]=1; }}r.pop();//出队 }if(flag==0)printf("no");return 0;}

bfs的算法的详解(代码版)相关推荐

  1. Tracking Learning Detection (TLD)目标跟踪算法原理详解~PPT版

  2. TOPSIS(逼近理想解)算法原理详解与代码实现

    写在前面: 个人理解:针对存在多项指标,多个方案的方案评价分析方法,也就是根据已存在的一份数据,判断数据中各个方案的优劣.中心思想是首先确定各项指标的最优理想值(正理想值)和最劣理想值(负理想解),所 ...

  3. Dijkstra算法图文详解和C++代码

    文章目录 1 Dijkstra算法基本原理 2 算法过程图解1(有向图) 3 算法过程图解2(无向图) 4 C++代码 4.1 案例1代码 4.2 案例2邻接矩阵定义 4.3 案例2代码Dijkstr ...

  4. 粒子群优化算法和python代码_Python编程实现粒子群算法(PSO)详解

    1 原理 粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的.假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位 ...

  5. ADMM,ISTA,FISTA算法步骤详解,MATLAB代码,求解LASSO优化问题

    ADMM,ISTA,FISTA算法步骤详解,MATLAB代码,求解LASSO优化问题 原创文章!转载需注明来源:©️ Sylvan Ding's Blog ❤️ 实验目的 了解 ADMM, ISTA, ...

  6. 【数据结构与算法】详解什么是图结构,并用代码手动实现一个图结构

    本系列文章[数据结构与算法]所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接 https://github.com/Lpyexplo ...

  7. [转]数据结构KMP算法配图详解(超详细)

    KMP算法配图详解 前言 KMP算法是我们数据结构串中最难也是最重要的算法.难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维.真正理解代码的人可以说对KMP算法的了解已经相当深入了.而 ...

  8. YOLOV1详解——Pytorch版

    YOLOV1详解--Pytorch版 1 YOLOV1 1 数据处理 1.1 数据集划分 1.2 读入xml文件 1.3 数据增强 2 训练 2.1 Backbone 2.2 Loss 2.3 tra ...

  9. 数据结构KMP算法配图详解(超详细)

    KMP算法配图详解 前言 KMP算法是我们数据结构串中最难也是最重要的算法.难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维.真正理解代码的人可以说对KMP算法的了解已经相当深入了.而 ...

  10. JavaScript数据结构与算法——链表详解(下)

    在JavaScript数据结构与算法--链表详解(上)中,我们探讨了一下链表的定义.实现原理以及单链表的实现.接下来我们进一步了解一下链表的其他内容. 1.双向链表 双向链表实现原理图: 与单向链表不 ...

最新文章

  1. “偷鸡”不成的马斯克,终于丢掉了自己的“王位”
  2. 火箭队老板成比特币粉丝 旗下豪车经销商接受BTC、BCH支付
  3. 将深度学习技术应用于基于情境感知的情绪识别
  4. python编程小游戏代码-Python小游戏之300行代码实现俄罗斯方块
  5. 科学计算机怎么显示除尽的数字,如何快速判断一个数能被整除的方法(1-23之内)...
  6. 第二周冲刺第四天个人博客
  7. [转]nchar,char,varchar与nvarchar区别
  8. Direct2D (3) : 使用浮点参数绘制基本图形
  9. ###《Effective STL》--Chapter3
  10. Redis基础6(Redis6管道)
  11. python之路-基础篇-002
  12. 十五、K8s helm包管理与应用
  13. 菜鸟教程学习Java
  14. 《网络是怎样连接的》了解网络连接的全貌
  15. VS2015安装教程
  16. 加密狗映射至虚拟服务器,ESXI 5.1/5.5 主机添加或映射USB设备(加密狗)(示例代码)...
  17. 详解js继承的那些事儿
  18. c语言程序流程图模板word,《流程图模板》word版.doc
  19. 只知道三角形三条边长不知道高是多少,用Python如何求三角形周长和面积,海伦公式帮你解决这个难题
  20. SSL 3.0 Poodle漏洞修复方法

热门文章

  1. LU列主元法解线性方程组
  2. 地图测量面积工具app_面积测量精灵手机版下载
  3. 《商用密码应用与安全性评估》第一章 密码基础知识-小结
  4. 【面试分享】奇安信渗透测试工程师,通过!
  5. cobar mysql_mysql分布式中间件cobar
  6. c语言printf输出格式
  7. 生活大爆炸第三季 那些精妙的台词翻译
  8. 怎么测试佩戴适合眼镜软件,如何在网上选择到适合自己的眼镜框?
  9. win10 自带计算器删除了怎么办
  10. SVM支持向量机原理(一) 线性支持向量机