bfs的算法的详解(代码版)
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的算法的详解(代码版)相关推荐
- Tracking Learning Detection (TLD)目标跟踪算法原理详解~PPT版
- TOPSIS(逼近理想解)算法原理详解与代码实现
写在前面: 个人理解:针对存在多项指标,多个方案的方案评价分析方法,也就是根据已存在的一份数据,判断数据中各个方案的优劣.中心思想是首先确定各项指标的最优理想值(正理想值)和最劣理想值(负理想解),所 ...
- Dijkstra算法图文详解和C++代码
文章目录 1 Dijkstra算法基本原理 2 算法过程图解1(有向图) 3 算法过程图解2(无向图) 4 C++代码 4.1 案例1代码 4.2 案例2邻接矩阵定义 4.3 案例2代码Dijkstr ...
- 粒子群优化算法和python代码_Python编程实现粒子群算法(PSO)详解
1 原理 粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的.假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位 ...
- ADMM,ISTA,FISTA算法步骤详解,MATLAB代码,求解LASSO优化问题
ADMM,ISTA,FISTA算法步骤详解,MATLAB代码,求解LASSO优化问题 原创文章!转载需注明来源:©️ Sylvan Ding's Blog ❤️ 实验目的 了解 ADMM, ISTA, ...
- 【数据结构与算法】详解什么是图结构,并用代码手动实现一个图结构
本系列文章[数据结构与算法]所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接 https://github.com/Lpyexplo ...
- [转]数据结构KMP算法配图详解(超详细)
KMP算法配图详解 前言 KMP算法是我们数据结构串中最难也是最重要的算法.难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维.真正理解代码的人可以说对KMP算法的了解已经相当深入了.而 ...
- YOLOV1详解——Pytorch版
YOLOV1详解--Pytorch版 1 YOLOV1 1 数据处理 1.1 数据集划分 1.2 读入xml文件 1.3 数据增强 2 训练 2.1 Backbone 2.2 Loss 2.3 tra ...
- 数据结构KMP算法配图详解(超详细)
KMP算法配图详解 前言 KMP算法是我们数据结构串中最难也是最重要的算法.难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维.真正理解代码的人可以说对KMP算法的了解已经相当深入了.而 ...
- JavaScript数据结构与算法——链表详解(下)
在JavaScript数据结构与算法--链表详解(上)中,我们探讨了一下链表的定义.实现原理以及单链表的实现.接下来我们进一步了解一下链表的其他内容. 1.双向链表 双向链表实现原理图: 与单向链表不 ...
最新文章
- “偷鸡”不成的马斯克,终于丢掉了自己的“王位”
- 火箭队老板成比特币粉丝 旗下豪车经销商接受BTC、BCH支付
- 将深度学习技术应用于基于情境感知的情绪识别
- python编程小游戏代码-Python小游戏之300行代码实现俄罗斯方块
- 科学计算机怎么显示除尽的数字,如何快速判断一个数能被整除的方法(1-23之内)...
- 第二周冲刺第四天个人博客
- [转]nchar,char,varchar与nvarchar区别
- Direct2D (3) : 使用浮点参数绘制基本图形
- ###《Effective STL》--Chapter3
- Redis基础6(Redis6管道)
- python之路-基础篇-002
- 十五、K8s helm包管理与应用
- 菜鸟教程学习Java
- 《网络是怎样连接的》了解网络连接的全貌
- VS2015安装教程
- 加密狗映射至虚拟服务器,ESXI 5.1/5.5 主机添加或映射USB设备(加密狗)(示例代码)...
- 详解js继承的那些事儿
- c语言程序流程图模板word,《流程图模板》word版.doc
- 只知道三角形三条边长不知道高是多少,用Python如何求三角形周长和面积,海伦公式帮你解决这个难题
- SSL 3.0 Poodle漏洞修复方法