题目大致描述:
迷宫由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 }