迷宫最短路径问题的dfs,bfs实现
迷宫的最短路径
给定一个大小为 N×M的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需的小步数。请注意,本题假定从起点一定可以移动到终点
限制条件:N,M<=100;
样例输入:N=10,M=10('#','.','S','G'分别表示墙壁,通道,起点和终点)
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
dfs分析:主要考虑当前应该怎么做,每到一个点下一步有上下左右四种情况,我们按顺时针方向右下左上来进行计算,到新的一个点判断是否走过以及有没有障碍物,如果答案是确定的就可以继续dfs。
#include <iostream>
#include <cstdio>
using namespace std;
int p0,q0,p1,q1;//储存起始点和终点的横纵坐标
char a[][];//根据数据量自己调整
int book[][];//标记数组来判断有没有到达
int next[][]={{,},{,},{,-},{-,}};//分别储存x,y坐标下一步的可能情况
int mini=;//先给最小路径一个很大的初值
int n,m;
void dfs(int x,int y,int step){
if(x==p1&&y==q1){
if(step<mini)
mini=step;
return ;//函数直接结束
}
for(int k=;k<;k++){
int nx=x+next[k][], ny=y+next[k][];//枚举下一步可能的横纵坐标
if(nx<||nx>n||ny<||ny>m){//控制不越界
continue;
}
if(book[nx][ny]==&&a[nx][ny]=='.'||book[nx][ny]==&&a[nx][ny]=='G'){
//cout<<step<<endl;
book[nx][ny]=;//标记走过了
dfs(nx,ny,step+);
book[nx][ny]=;//注意dfs后返回这一点为没走过。
}
}
return ;
}
int main(){
cin>>n>>m;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='S'){
p0=i;q0=j;
}
if(a[i][j]=='G'){
p1=i;q1=j;
}
}
}
//cout<<p0<<q0<<p1<<q1<<endl;
//if(a[2][1]=='.') cout<<"just a test \n";
book[p0][q0]=;//标记起始点走过了
dfs(p0,q0,);
cout<<mini<<endl;
return ;
}
BFS分析:同深搜选择一个点之后不断继续往下深入不同,宽搜是记录所有到达后步数相同的点,更适宜做最短路径的问题。
#include <iostream>
#include <cstdio>
using namespace std;
char a[][];//根据题意自己设定数据量
int book[][];//标记某点是否到达
int sx,sy,gx,gy;//起始点坐标
struct node{
int x;
int y;
int s;//s表示步数
};
node q[];//100*100的地图队列扩展最多是10000
int main(){
int head,tail;head=tail=; //一开始清空队列
int n,m;
cin>>n>>m;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='S'){
sx=i;sy=j;
}
if(a[i][j]=='G'){
gx=i;gy=j;
}
}
}
int next[][]={{,},{,},{-,},{,-}};
q[tail].x=sx;q[tail].y=sy;q[tail].s=;//将起点数据压入队列
tail++; book[sx][sy]=;
int flag=;//flag是为了找到最短路径后跳出while循环用的
while(head<tail){
for(int k=;k<;k++){
int tx=q[head].x+next[k][],ty=q[head].y+next[k][];
//判断是否越界
if(tx<||tx>n||ty<||ty>m)
continue;
if(book[tx][ty]==&&a[tx][ty]!='#'){
q[tail].x=tx;q[tail].y=ty;q[tail].s=q[head].s+;
book[tx][ty]=;tail++;
}
if(tx==gx&&ty==gy){
flag=;
break;
}
}
if(flag) break;
head++;
}
cout<<q[tail-].s<<endl;
return ;
}
总结一下,dfs和bfs都能都能生成所有能够遍历到的状态,但是递归可以更尖端的编写且管理起来更简单,所以大多数情况还是用dfs实现,反之,bfs处理起最短路径时更方便。
此外,dfs更加节省内存。
迷宫最短路径问题的dfs,bfs实现的更多相关文章
- 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)
[题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...
- cdoj1088-王之迷宫 (三维迷宫最短路径)【BFS】
http://acm.uestc.edu.cn/#/problem/show/1088 王之迷宫 Time Limit: 3000/1000MS (Java/Others) Memory Li ...
- POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE
POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...
- DFS/BFS+思维 HDOJ 5325 Crazy Bobo
题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...
- ID(dfs+bfs)-hdu-4127-Flood-it!
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4127 题目意思: 给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相 ...
- [LeetCode] 130. Surrounded Regions_Medium tag: DFS/BFS
Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...
- HDU 4771 (DFS+BFS)
Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...
- DFS/BFS视频讲解
视频链接:https://www.bilibili.com/video/av12019553?share_medium=android&share_source=qq&bbid=XZ7 ...
- [LeetCode]695. 岛屿的最大面积(DFS/BFS)、200. 岛屿数量(DFS/BFS待做/并差集待做)
695. 岛屿的最大面积 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被 ...
随机推荐
- WSL及Linux入门
win10内置linux子系统(Windows Subsystem for Linux),可以不用安装Vmware等虚拟机学习linux啦. wsl开启方式 设置打开开发人员模式. 控制面板-程序和功 ...
- P3455 [POI2007]ZAP-Queries(莫比乌斯反演)
思路 和YY的GCD类似但是更加简单了 类似的推一波公式即可 \[ F(n)=\sum_{n|d}f(d) \] \[ f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d) \] \ ...
- CAS实现单点登录SSO执行原理探究超详细
一.不落俗套的开始 1.背景介绍 单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. CAS框架:CAS(Centra ...
- Ubuntu14.04下 安装p4c
参考: Github p4c README Ubuntu14.04下 安装p4c 这里提供一个直接安装p4c的脚本:install_p4c.sh. 1.git clone下来p4c: $ git cl ...
- python学习之re库
正则表达式库re是非常重要的一个库. 首先正则表达式有两种表示类型,一种是raw string类型(原生字符串类型),也就是我们经常看到的r' '的写法,另一种是不带r的写法,称为string类型. ...
- Spring-Mybatis依赖
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency> <groupId& ...
- 【BZOJ】4011: [HNOI2015]落忆枫音
题目链接:http://blog.csdn.net/popoqqq/article/details/45194103 写代码的时候也没有很清晰....具体看这里吧 #include<iostre ...
- Hash——字符串匹配(求s1在s2中出现的次数)
题目描述: 这是一道模板题. 给定一个字符串 A 和一个字符串 B ,求 B 在 A 中的出现次数.A 和 B中的字符均为英语大写字母. 求A 在 B 中出现了几次.(可重叠) 样例输入: 3 BA ...
- virtualbox中的虚拟机和windows共享文件夹
http://www.jianshu.com/p/4e3c8b06cb06 为什么要共享文件夹? 在工作的过程当中会使用到不同的软件开发环境,php的,python的,nodejs的为了隔离这些应用环 ...
- 使用@JsonFormat引起的时间比正常时间慢8小时解决方法
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")