一、
因为栈是后进先出的特性,所以说一般用栈都是通过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 ( " 迷宫系统 \n"); 121 printf ( " \n"); 122 printf ( " \n"); 123 printf ("-------------------------------------- \n"); 124 printf ("--------------------------------------\n"); 125 printf ("--------丨[0]重构地图 丨---\n"); 126 printf ("--------丨[1]使用默认地图 丨---\n"); 127 printf ("--------丨[2]结束 丨---\n"); 128 printf ("----------输入相应数字----------------\n"); 129 printf ("--------------------------------------- \n"); 130 printf ( " \n"); 131 printf ( " \n"); 132 scanf("%d",&x); 133 if(x==0) 134 { 135 system("cls"); 136 printf(" 重构地图\n"); 137 printf("输入内容请以空格或者换行分隔开,且0代表此处可走,1代表此处不可行\n"); 138 printf("\n现在请输入地图是几行几列\n"); 139 int n,m; 140 memset(mg,0,sizeof(mg)); 141 scanf("%d%d",&n,&m); 142 int flag=0; 143 printf("\n请输入地图,请保证左上角和右下角都为0\n"); 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 }