迷宫问题

定义一个二维数组:

int maze[5][5] = {

0, 1, 0, 0, 0,

0, 1, 0, 1, 0,

0, 0, 0, 0, 0,

0, 1, 1, 1, 0,

0, 0, 0, 1, 0,

};


它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

 

Input 一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。 Output 左上角到右下角的最短路径,格式如样例所示。 Sample Input
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
Sample Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
 1 #include<iostream>
 2 #include<stack>
 3 using namespace std;
 4 int maze[5][5];
 5 int vis[5][5];
 6 int dx[]={0,-1,1,0};
 7 int dy[]={1,0,0,-1};
 8 struct node{
 9     int x,y;
10     //int step;
11 };
12 int flag;
13 node ans[5000];
14 void DFS(int x,int y,int step)
15 {
16     if(x==4&&y==4&&!flag)
17     {
18         flag=1;
19         ans[step].x=x;
20         ans[step].y=y;
21         for(int i=0;i<=step;i++)
22             cout<<"("<<ans[i].x<<", "<<ans[i].y<<")"<<'\n';
23     }
24     else if(!flag)
25     {
26         for(int i=0; i<4; i++)
27         {
28             int sx=x+dx[i];
29             int sy=y+dy[i];
30             if(sx>=0&&sx<5&&sy>=0&&sy<5&&!vis[sx][sy]&&maze[sx][sy]==0)
31             {
32                 ans[step].x=x;
33                 ans[step].y=y;
34                 vis[x][y]=1;
35                 DFS(sx,sy,step+1);//前缀的++后缀++都不对
36                 vis[x][y]=0;
37             }
38         }
39     }
40 }
41 int main()
42 {
43     for(int i=0;i<5;i++)
44     {
45         for(int j=0;j<5;j++)
46             cin>>maze[i][j];
47     }
48     DFS(0,0,0);//从零开始
49 }

 

posted @ 2020-11-18 18:56  BlackSnow  阅读(134)  评论(0)    收藏  举报