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++下通过,如有错误欢迎指正!!!
浙公网安备 33010602011771号