迷宫问题

来源:互联网 发布:域名接入阿里云 编辑:程序博客网 时间:2024/05/02 00:27

2012-05-24

给定迷宫矩阵maze[][],行数M_con+2,列数N_con+2。从第1行到第M_con行,从第1列到第N_con列为迷宫数据(简而言之矩阵maze去掉外围一圈就是迷宫数据),0可行,1不可行,可以直着走或斜着走,共8个方向可以供选择。从左上入口走到右下出口,寻找路径。

迷宫问题 

/**************************************************//迷宫问题***************************************************/#include <iostream>#include <stack>using namespace std;//设定迷宫行数#define M_con 4//设定迷宫列数#define N_con 4//有关方向的结构体struct offsets{int a,b;};//有关方向的枚举类型enum directions {N,NE,E,SE,S,SW,W,NW};//数组move[]包含了各个方向的移动offsets move[8]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1} };//结构体item为如何移动及移动对应的方向struct item{int row,col,dir;};template <class Type>ostream& operator << (ostream& os, stack<Type>& s){int p=s.size();for(int i=0;i<p;i++){os<<s.top().row<<','<<s.top().col<<','<<s.top().dir-1<<endl;s.pop();}return os;}//maze[][]为含0、1数的矩阵,为0表示可行,为1表示不可行,比迷宫多了一圈,该一圈全为1即不可行。int maze[M_con+2][N_con+2];//mark[][]为含0、1数的矩阵,为0表示还没用过该点,为1表示已经用过该点,比迷宫多了一圈,该一圈全为1即不可行。int mark[M_con+2][N_con+2];void path(const int m,const int n){mark[1][1]=1;stack<item> stck;item temp;temp.row=1; temp.col=1; temp.dir=E;stck.push(temp);while(!stck.empty()){temp=stck.top();stck.pop();int i=temp.row;int j=temp.col; int d=temp.dir;while(d<8){int g=i+move[d].a; int h=j+move[d].b;// cout<<"--"<<g<<','<<h<<endl;if((g==m)&&(h==n)){cout<<stck;cout<<"**************"<<endl;cout<<i<<","<<j<<","<<d<<endl;cout<<m<<","<<n<<endl;return;}if((!maze[g][h]) && (!mark[g][h]) ){mark[g][h]=1;//如果g、h位置可行,则将上一个点i,j及下一个方向存储起来,以防止g、h向下不可行,重新回到i,j及下一个方向temp.row=i;temp.col=j;temp.dir=d+1;stck.push(temp);//将当前点i,j移到下一个点g、hi=g;j=h;d=N;}elsed++;}}cout<<"该迷宫不存在路径!"<<endl;}int main(){//初始设置mark[][]for(int j=0;j<M_con+2;j++){for(int i=0;i<N_con+2;i++){if(i==0 || j==0 ||i==N_con+1 ||j==M_con+1)mark[j][i]=1;elsemark[j][i]=0;}}//设置迷宫maze[][]矩阵for(j=0;j<M_con+2;j++){for(int i=0;i<N_con+2;i++){// if(j==i && (i!= 0) )// maze[j][i]=0;// elsemaze[j][i]=1;}}maze[1][1]=0;maze[2][1]=0;maze[3][1]=0;maze[4][2]=0;maze[4][3]=0;maze[4][4]=0;//打印初始标记矩阵mark[][]cout<<"初始mark[][]"<<endl;for(j=0;j<M_con+2;j++){for(int i=0;i<N_con+2;i++)cout<<mark[j][i]<<"";cout<<endl;}cout<<"**************"<<endl;//打印初始迷宫矩阵maze[][]cout<<"初始迷宫矩阵maze[][]"<<endl;for(j=0;j<M_con+2;j++){for(int i=0;i<N_con+2;i++)cout<<maze[j][i]<<"";cout<<endl;}cout<<"**************"<<endl;//寻找路径path(M_con,N_con);return 0;}









原创粉丝点击