DFS(深度优先遍历算法)

题目描述:有一个n行m列的迷宫,现在JM想要从迷宫中的某一点,走到另外一点,请你找一条最短路径来帮助JM,请问最短距离是多少?

在迷宫中,用1代表可以走的路,用2代表墙壁,不可以走

输入:第一行输入迷宫范围n,m;再输入迷宫分布;

最后一行输入JM要走到的目的地。

【测试样例】输入:

5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1 4 3

【输出】7

<----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->

【题目分析】

要想找到所有路径中的最短路径 ,显然我们可以使用DFS来解决此问题,通过定义一个二维map数组用来存放迷宫的分布,在定义一个vis数组来记录此位置是否已经被访问过。

代码实现】:

 

#include<iostream>
using namespace std;
int map[100][100];// 1 代表路径 ,2代表墙壁
int vis[100][100];// 0 未被访问,1已经被访问
int n,m,p,q,mi=999999;
void dfs(int x,int y,int step){
if(x==p&&y==q){    //代表JM已经走到了中的位置
if(step<mi)     //判断当前的步数是否小于最小值,如果是小,则进行替换
mi=step;
return ;    
}
//JM向右走
if(map[x][y+1]==1&&vis[x][y+1]==0){     //当前位置的右面是否可以走(1,可以走;2不可以走),并且判断该位置是否已经被访问过
vis[x][y+1]=1;  //走到此位置,将该位置置位已经访问
dfs(x,y+1,step+1);  //dfs  进行深搜
vis[x][y+1]=0; //深搜完毕以后,置位未访问
}
//JM向下走
if(map[x+1][y]==1&&vis[x+1][y]==0){
vis[x+1][y]=1;
dfs(x+1,y,step+1);
vis[x+1][y]=0;
}
//JM向左走
if(map[x][y-1]==1&&vis[x][y-1]==0){
vis[x][y-1]=1;
dfs(x,y-1,step+1);
vis[x][y-1]=0;
}
//JM向上 走
if(map[x-1][y]==1&&vis[x-1][y]==0){
vis[x-1][y]=1;
dfs(x-1,y,step+1);
vis[x-1][y]=0;
}

return ;
}
int main(){
int startx,starty;
cin>>n>>m;    //输入迷宫的大小
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>map[i][j];  //输入迷宫分布情况
}
}
cin>>startx>>starty>>p>>q;  //输入JM起始位置和结束位置
vis[startx][starty]=1;   //最开始位置置位已经访问
dfs(startx,starty,0);    //开始dfs深搜
cout<<mi;   //输出最短路径
return 0;
}

【运行结果】

本代码在DevC++下通过,如有错误欢迎指正!!!

posted on 2020-10-28 23:20  Studyxy  阅读(364)  评论(0)    收藏  举报