求迷宫从入口到出口的所有路径是一个经典的程序设计问题。由于计算机解迷宫问题时,通常用的是“穷举求解”的方法,即从入口出发顺某一方向向前探索,若能走通,则继续往前走,否则沿原路返回,换一个方向继续探索,直至所有的通路都探索完为止。显然,在迷宫求解的问题中要应用“栈”的数据结构。
很长时间了今天把这个思路梳理了一下。
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
typedef struct stk
{
int x,y;
int d;
stk(int a,int b,int c){/**< 有参数的构造函数 */
x=a;
y=b;
d=c;
}
stk(){}
}STK;
int row,col;
int c1,c2,p1,p2;
stack<STK>Mys;
int mark[101][101]; //访问标志
int maze[101][101]; //迷宫数组
void init()
{
for(int i=0;i<=row+1;i++)
for(int j=0;j<=col+1;j++)
maze[i][j]=1;
}
void Path()
{
int dir[2][4]={0,1,0,-1,1,0,-1,0};
int i=c1+1,j=c2+1,k=0,g,h;
mark[c1][c2]=1;
STK elem(i,j,k);
Mys.push(elem);
do{
g=i+dir[0][k];
h=j+dir[1][k];
if((maze[g][h]==0)&&(mark[g][h]==0)) //当该点没有走过,并且能够通过时
{
mark[g][h]=1;
STK elem(g,h,k);
Mys.push(elem);
i=g,j=h,k=0;
}
else if(k<3) //探索四个方向
k+=1;
else if(!Mys.empty())
{
STK elem=Mys.top();
i=elem.x;
j=elem.y;
k=elem.d;
}
else {
cout<<"No."<<endl;
return;
}
}while((g<p1+1)||(h<p2+1));
cout<<"Yes."<<endl;
}
int main(){
cin>>row>>col;
memset(mark,0,sizeof(mark)); //此函数只能够初始化0 -1或者字符
init();
cin>>c1>>c2; //起点
cin>>p1>>p2; //终点
for(int i=1;i<=row;i++)
for(int j=1;j<=col;j++)
cin>>maze[i][j];
Path();
return 0;
}