深度优先搜索——采药的最短路径
题目描述
少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由M×N个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。
输入描述
第1行输入两个非零整数 M 和 N ,两者均不大于20。M 表示迷阵行数, N 表示迷阵列数。
接下来有 M 行, 每行包含N个字符,不同字符分别代表不同含义:
‘@’:少年李逍遥所在的位置;
‘.’:可以安全通行的方格;
‘#’:有怪物的方格;
‘*’:仙药所在位置。
输出描述
求李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 -1。
输入样例
8 8
.@##…#
#…#.#
#.#.##…
…#.###.
#.#…#.
…###.#.
…#.*…
.#…###
输出样例
10
方法1(非深度优先搜索算法):
#include<bits/stdc++.h>
using namespace std;
int dx[4]={0,0,-1,1},dy[4]={-1,1,0,0};
int main()
{int m,n,ansx,ansy;int k[25][25];memset(k,-1,sizeof k);
//将数组初始化为-1方便后续的操作,若该位置在程序结束时仍为-1则表示此位置不可到达cin>>n>>m;char j[25][25];for(int c=1;c<=n;c++){for(int d=1;d<=m;d++){cin>>j[c][d];if(j[c][d]=='@') k[c][d]=0;if(j[c][d]=='*'){ansx=c;ansy=d;}}}
//记录迷宫的起始位置,和题目要求达到的位置;int count=0,p=0;
//使用count来记录当前走到了多少步了for(int c=0;c<500;c++){
//因为题目中要求的是迷宫总大小小于400个单位,所以即使我们走最曲折的走法也不过需要400步,
//所以循环500次已经足够了(该循环的意思是遍历二维数组多少次,每次遍历计算出下一步可以走的位置)for(int d=1;d<=n;d++){for(int e=1;e<=m;e++){if(k[d][e]==count){
//若此时走到了上一步的位置那么从上一步的位置可以判断
//其上下左右的位置是否可以走(是否可以作为下一步的位置)for(int f=0;f<4;f++){int l=d+dx[f],r=e+dy[f];if(l>0&&l<=m&&r>0&&r<=n){
//判断边界位置防止数组越界if(j[l][r]=='.'&&k[l][r]==-1){
//若在地图上的该位置允许走且没有走过则可以走该位置,
//走到该位置需要将该位置在地图上处理为'#'来表示此位置已经走过了j[l][r]='#';k[l][r]=count+1;p=1;}if(j[l][r]=='*'){
//如果已经走到了要求的位置那么即可结束程序cout<<count+1;return 0;}}}}}}
//若此时遍历一遍数组后还没有下一个位置可以走那么表示已经走不到题目要求的位置了if(!p){cout<<-1;return 0;}else count++;
}cout<<-1;
}
方法二:
#include<bits/stdc++.h>
using namespace std;
int m,n,x,y,xi,yi;
int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};
char i[25][25];
int j[25][25];//记录走到该位置的最小步数
typedef pair<int,int> pp;
//定义一个新的类型,该类型由两个int类型的整数构成
void dfs(int a,int b){queue <pp> k;
//定义一个队列,因为队列是先进先出的特性符合算法思路:
//先把起始位置放入到队列当中,表示该队列目前还有位置的四周需要考虑是否可走;k.push({a,b});j[a][b]=0;while(k.size()){
//若此时队列中为空则表示已经走完了所有的步数;pp l=k.front();
//将该队列的首位取出来讨论并在队列当中删除;k.pop();for(int c=0;c<4;c++){int xl=l.first+dx[c],yl=l.second+dy[c];if(xl>=0&&xl<n&&yl>=0&&yl<m&&i[xl][yl]!='#'&&j[xl][yl]==-1){
//若该数的四周的位置不越界且可走则将该位置放入到队列中等待被取出;k.push({xl,yl});j[xl][yl]=j[l.first][l.second]+1;if(i[xl][yl]=='*') break;i[xl][yl]='#';
//走后将该位置放上栅栏表示该位置不可再走了}}}
}
int main()
{cin>>n>>m;memset(j,-1,sizeof j);
//同样初始或数组为-1方便后续的操作for(int c=0;c<m;c++){for(int d=0;d<n;d++){cin>>i[c][d];if(i[c][d]=='@'){x=c,y=d;}if(i[c][d]=='*'){xi=c,yi=d;}}}
//记录起始位置和题目要求的中止位置dfs(x,y);
//将初始位置载入到dfs当中cout<<j[xi][yi];return 0;
}
我是笨蛋
深度优先搜索——采药的最短路径相关推荐
- 【数据结构与算法】2.深度优先搜索DFS、广度优先搜索BFS
原文链接:https://blog.csdn.net/qq_41681241/article/details/81432634 总结 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的 ...
- 一文搞懂深度优先搜索、广度优先搜索(dfs、bfs)
前言 你问一个人听过哪些算法,那么深度优先搜索(dfs)和宽度优先搜索(bfs)那肯定在其中,很多小老弟学会dfs和bfs就觉得好像懂算法了,无所不能,确实如此,学会dfs和bfs暴力搜索枚举确实利用 ...
- 数据结构与算法—图论之dfs、bfs(深度优先搜索、宽度优先搜索)
文章目录 前言 邻接矩阵和邻接表 深度优先搜索(dfs) 宽度(广度)优先搜索(bfs) 总结与比较 前言 在有向图和无向图中,如果节点之间无权值或者权值相等,那么dfs和bfs时常出现在日常算法中. ...
- 图的广度优先搜索(bfs)以及深度优先搜索(dfs)
1.前言 和树的遍历类似,图的遍历也是从图中某点出发,然后按照某种方法对图中所有顶点进行访问,且仅访问一次. 但是图的遍历相对树而言要更为复杂.因为图中的任意顶点都可能与其他顶点相邻,所以在图的遍历中 ...
- LQ训练营(C++)学习笔记_深度优先搜索
深度优先搜索 三.深度优先搜索 1.普通深度优先搜索 1.1 迷宫问题描述 1.2 代码实现 2.抽象深度优先搜索问题 2.1 和为K问题 2.1.1 问题描述 2.1.2 解题思路 2.1.3 代码 ...
- 算法导论--广度优先搜索和深度优先搜索
广度优先搜索 在给定图G=(V,E)和一个特定的源顶点s的情况下,广度优先搜索系统地探索G中的边,以期"发现"可从s 到达的所有顶点,并计算s 到所有这些可达顶点之间的距离(即最少 ...
- 数据结构与算法--图论-深度优先搜索及其应用
深度优先搜索 深度优先搜索(depth-first search) 是对先序遍历(preorder traversal)的推广,我们从某个顶点v开始处理v,然后递归的遍历所有与v邻接顶点.如果这个过程 ...
- ReviewForJob——深度优先搜索的应用
[0]README 1)本文旨在 介绍 ReviewForJob--深度优先搜索的应用 及其 源码实现 : 2)搜索树的技术分为广度优先搜索 和 深度优先搜索:而广度优先搜索,我们前面利用 广度优先搜 ...
- 广度优先搜索(BFS)与深度优先搜索(DFS)
一.广度优先搜索(BFS) 1.二叉树代码 # 实现一个二叉树 class TreeNode:def __init__(self, x):self.val = xself.left = Nonesel ...
最新文章
- 2021阿里全球数学竞赛获奖名单出炉!北大获奖人数最多!
- SAMBA配置文件所用到的参数
- 石川es6课程---18、ES6 复习
- SAP Spartacus user-addresses.effect.ts里发送地址加载成功的action,会触发我们自己的reducer
- python错误bug调试问题汇总
- Windows Phone性能优化建议
- 为什么闲鱼不能搜索python_Python 分析后告诉你闲鱼上哪些商品抢手?
- 【2017年第3期】开放政府环境下医药公司与医生之间的价值转移
- 自学Python:截取屏幕画面
- 用FadingActionBar实现有头图的ActionBar
- 机器人领域会议期刊特点
- android 面向对象 5,C++基础学习笔记(5)---面向对象(测试题)
- ArcGIS TIN地表面与栅格地表面的生成与互相转换
- unity蛮牛游戏API
- Linux下图片 jpg、png、gif 与 eps 格式的相互转换
- 计算机热点ip设置,电脑宽带怎样设置wifi热点
- 【Travis CI使用教程】如何让定制你的travis.yml配置文件
- java 水晶按钮_水晶按钮制作 jsp function调用java方法
- 小清新版js扫雷(使用原生js)
- 从质量低到高带你了解影片名里面的TC、HD等的含义