DFS 迷宫问题

题目大致描述:

迷宫由n行m列的单元格组成(n,m都小于等于50) 每个单元格要么是空地,要么是障碍物 找到一条从起点到终点的最短路径长度
  1 /*
  2  * @Descripttion: 
  3  * @version: 
  4  * @Author: ZKYAAA
  5  * @Date: 2020-04-20 22:25:27
  6  * @LastEditors: 请叫我ZK谕啊啊啊
  7  * @LastEditTime: 2020-04-20 23:42:48
  8 
  9 *问题描述:
 10 *迷宫由n行m列的单元格组成(n,m都小于等于50)
 11 *每个单元格要么是空地,要么是障碍物
 12 *找到一条从起点到终点的最短路径长度
 13 
 14 5 4
 15 1 1 2 1 
 16 1 1 1 1
 17 1 1 2 1
 18 1 2 1 1
 19 1 1 1 2
 20 1 1 4 3
 21 */
 22 
 23 #include <bits/stdc++.h>
 24 using namespace std;
 25 const int MAXN=100;
 26 int p,q,Min=1e9,n,m;
 27 int a[MAXN][MAXN];      //1表示空地,2表示障碍物
 28 int vis[MAXN][MAXN];    //0表示未访问,1表示访问
 29 
 30 int dir[4][2]={
 31     {0,1},
 32     {1,0},
 33     {0,-1},
 34     {-1,0},
 35 };
 36 
 37 // int dirx[4]={0,1,0,-1};     //四个方向左下右上
 38 // int diry[4]={1,0,-1,0};
 39 
 40 void dfs(int x,int y,int step){
 41     if(x==p&&y==q){
 42         if(step<Min){
 43             Min=step;
 44         }
 45         return;         //往回回溯
 46     }
 47     //顺时针右下左上试探
 48     //优化代码
 49     for(int k=0;k<4;k++){
 50         // int dx=x+dirx[k];
 51         // int dy=y+diry[k];
 52         int dx=x+dir[k][0];
 53         int dy=y+dir[k][1];
 54         if(a[dx][dy]==1&&vis[dx][dy]==0){
 55             vis[dx][dy]=1;
 56             dfs(dx,dy,step+1);
 57             vis[dx][dy]=0;
 58         }
 59     }
 60     /*
 61     //右
 62     if(a[x][y+1]==1&&vis[x][y+1]==0)        //判断(x,y)的右边是否被访问且不是障碍物
 63     {
 64         vis[x][y+1]=1;
 65         dfs(x,y+1,step+1);
 66         vis[x][y+1]=0;                      //dfs执行后回溯到这个点,标记未访问,继续找step
 67     }
 68     //下
 69     if(a[x+1][y]==1&&vis[x+1][y]==0)        //判断(x,y)的下边是否被访问且不是障碍物
 70     {
 71         vis[x+1][y]=1;
 72         dfs(x+1,y,step+1);
 73         vis[x+1][y]=0;                      //dfs执行后回溯到这个点,标记未访问,继续找step
 74     }
 75     //左
 76     if(a[x-1][y]==1&&vis[x-1][y]==0)        //判断(x,y)的左边是否被访问且不是障碍物
 77     {
 78         vis[x-1][y]=1;
 79         dfs(x-1,y,step+1);
 80         vis[x-1][y]=0;                       //dfs执行后回溯到这个点,标记未访问,继续找step
 81     }
 82     //上
 83     if(a[x][y-1]==1&&vis[x][y-1]==0)        //判断(x,y)的上边是否被访问且不是障碍物
 84     {
 85         vis[x][y-1]=1;
 86         dfs(x,y-1,step+1);
 87         vis[x][y-1]=0;                       //dfs执行后回溯到这个点,标记未访问,继续找step
 88     }
 89    */
 90     return;                                 //回退
 91 }
 92 
 93 int main(){
 94     int startx,starty;
 95     memset(vis,0,sizeof(vis));
 96     cin>>m>>n;
 97     //一开始写为先n后m创建一个迷宫,一直出错运行为5
 98     for(int i=1;i<=m;i++)
 99         for(int j=1;j<=n;j++)
100             cin>>a[i][j];
101     cin>>startx>>starty>>p>>q;
102     vis[startx][starty]=1;
103     dfs(startx,starty,0);
104     cout<<Min;
105     return 0;
106 }

 

上一篇:剑指offer 19.顺时针打印矩阵


下一篇:Vue2.5 旅游项目实例15 城市选择页-兄弟组件数据传递