用栈解决迷宫问题

一、

因为栈是后进先出的特性,所以说一般用栈都是通过dfs来解决迷宫问题。如果用队列的话就是通过bfs来解决。

二、

c++代码:

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<stdio.h>
  4 #include<string.h>
  5 #include<windows.h>
  6 using namespace std;
  7 const int maxn=1005;
  8 #define MaxSize    100005     //栈最多元素个数
  9 int M=4,N=4;
 10 int w[6][6]=
 11 {
 12     {1,1,1,1,1,1}
 13     ,{1,0,0,0,1,1}
 14     ,{1,0,1,0,0,1}
 15     ,{1,0,0,0,1,1}
 16     ,{1,1,0,0,0,1}
 17     ,{1,1,1,1,1,1}
 18 };
 19 int mg[maxn][maxn];
 20 char s[maxn][maxn];
 21 struct migong
 22 {
 23     int i;      //路径横坐标
 24     int j;      //路径纵坐标
 25     int di;     //方向
 26 } Stack[MaxSize],Path[MaxSize];     //定义栈和存放最短路径的数组
 27 int top=-1;     //栈顶指针
 28 int counts=1;    //路径数计数
 29 int minlen=MaxSize;     //最短路径长度
 30 void mgpath()       //路径为:(1,1)->(M,N)
 31 {
 32     int i,j,di,finds,k;
 33     top++;
 34     Stack[top].i=1;
 35     Stack[top].j=1;
 36     Stack[top].di=-1;
 37     mg[1][1]=-1;        //初始结点进栈
 38     while(top>-1)       //栈不空时循环
 39     {
 40         i=Stack[top].i;
 41         j=Stack[top].j;
 42         di=Stack[top].di;
 43         if(i==M && j==N)        //找到了出口,输出路径
 44         {
 45 //            cout<<counts<<": ";
 46 //            counts++;
 47 //            for(k=0; k<=top; k++)
 48 //            {
 49 //                cout<<"("<<Stack[k].i<<","<<Stack[k].j<<")"<<" ";
 50 //
 51 //            }
 52 //            cout<<endl;
 53             if(top+1<minlen)        //比较输出最短路径
 54             {
 55                 for(k=0; k<=top; k++)
 56                     Path[k]=Stack[k];
 57                 minlen=top+1;
 58             }
 59             mg[Stack[top].i][Stack[top].j]=0;   //让该位置变为其他路径的可走结点
 60             top--;
 61             i=Stack[top].i;
 62             j=Stack[top].j;
 63             di=Stack[top].di;
 64         }
 65         finds=0;
 66         while(di<4 && finds==0)      //找下一个可走结点
 67         {
 68             di++;
 69             switch(di)
 70             {
 71             case 0:
 72                 i=Stack[top].i-1;
 73                 j=Stack[top].j;
 74                 break;   //上面
 75             case 1:
 76                 i=Stack[top].i;
 77                 j=Stack[top].j+1;
 78                 break;   //右边
 79             case 2:
 80                 i=Stack[top].i+1;
 81                 j=Stack[top].j;
 82                 break;   //下面
 83             case 3:
 84                 i=Stack[top].i;
 85                 j=Stack[top].j-1;
 86                 break;   //左边
 87             }
 88             if(mg[i][j]==0)   //因为地图外边围了一层墙,所以不需要判断边界
 89                 finds=1;
 90         }
 91         if(finds == 1)       //找到了下一个可走结点
 92         {
 93             Stack[top].di=di;   //修改原栈顶元素的di值
 94             top++;      //下一个可走结点进栈
 95             Stack[top].i=i;
 96             Stack[top].j=j;
 97             Stack[top].di=-1;
 98             mg[i][j]=-1;        //避免重复走到该结点
 99         }
100         else
101         {
102             mg[Stack[top].i][Stack[top].j]=0;   //让该位置变为其他路径的可走结点
103             top--;
104         }
105     }
106     cout<<"最短路径如下(输出结果以坐标显示)"<<endl;
107     cout<<"长度:  "<<minlen<<endl;
108     cout<<"路径:  "<<endl;
109     for(k=0; k<minlen; k++)
110     {
111         cout<<"("<<Path[k].i<<","<<Path[k].j<<")"<<" ";
112     }
113 }
114 int main()
115 {
116     int x;
117     while(1)
118     {
119         system("cls");
120         printf ( "             迷宫系统                                            
");
121         printf ( "                                                                 
");
122         printf ( "                                                                 
");
123         printf ("--------------------------------------                           
");
124         printf ("--------------------------------------
");
125         printf ("--------丨[0]重构地图            丨---
");
126         printf ("--------丨[1]使用默认地图        丨---
");
127         printf ("--------丨[2]结束                丨---
");
128         printf ("----------输入相应数字----------------
");
129         printf ("---------------------------------------                           
");
130         printf ( "                                                                 
");
131         printf ( "                                                                 
");
132         scanf("%d",&x);
133         if(x==0)
134         {
135             system("cls");
136             printf("            重构地图
");
137             printf("输入内容请以空格或者换行分隔开,且0代表此处可走,1代表此处不可行
");
138             printf("
现在请输入地图是几行几列
");
139             int n,m;
140             memset(mg,0,sizeof(mg));
141             scanf("%d%d",&n,&m);
142             int flag=0;
143             printf("
请输入地图,请保证左上角和右下角都为0
");
144             for(int i=1; i<=n; ++i)
145             {
146 
147                 scanf("%s",s[i]+1);
148                 mg[i][0]=mg[i][m+1]=1;
149             }
150             for(int j=1; j<=m; ++j)
151             {
152                 mg[0][j]=mg[n+1][j]=1;
153             }
154             for(int i=1;i<=n;++i)
155             {
156                 for(int j=1;j<=m;++j)
157                 {
158                     mg[i][j]=s[i][j]-'0';
159                 }
160             }
161             M=n;
162             N=m;
163 
164             //cout<<"迷宫所有路径如下:"<<endl;
165             mgpath();
166             system("pause");
167         }
168         else if(x==1)
169         {
170             system("cls");
171             M=N=4;
172             for(int i=0; i<6; ++i)
173             {
174                 for(int j=0; j<6; ++j)
175                 {
176                     mg[i][j]=w[i][j];
177                 }
178             }
179             mgpath();
180             system("pause");
181         }
182         else break;
183     }
184     return 0;
185 }
View Code
原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/11835137.html