#include
using namespace std;
#include
typedef struct
{
int x,y;//当前访问的迷宫格子的纵横坐标
int di;//当前方向编号,只能为0、1、2、3 四个方向 ,分别表示右下左上
}Box;
typedef struct
{//x,y方向的增量
int incX,incY;
}Direction;
Direction direct[4]={{0,1},{1,0},{0,-1},{-1,0}};//右、下、左、上方向试探
typedef struct LNode
{
Box data;
struct LNode *next;
}LNode,*LinkList;
LinkList base,top;
void InitStack(LinkList &s)
{//初始化栈
s=new LNode;
base=new LNode;
s->next=base;
base->next=NULL;
top=base;
}
void push(LinkList &s,Box e)
{//将元素e压入栈顶,头插法
LinkList p;
top->data=e;
p=new LNode;
p->next=s->next;
s->next=p;
top=p;
}
void pop(LinkList &s)
{//将栈顶元素出栈
LinkList p;
p=top->next;
top->next=p->next;
delete p;
}
void getTop(LinkList s,Box &e)
{//将栈顶元素赋值给e
e=top->next->data;
}
void printStack(LinkList s)
{
LinkList p = top->next;//遍历指针
while (p!=NULL)
{
cout<<"("<data.x<<","<data.y<<","<data.di<<")"<<'\t';
p = p->next;
}
}
int findPath(int maze[10][10],Direction direct[4],LinkList &s)
{
Box temp;
int x,y,di;//迷宫格子当前正在处理单元的纵横坐标和方向
int line,col;//迷宫数组下一单元的行坐标和列坐标
maze[1][1]=-1;//从入口出发,走过的格子赋值为-1
temp.x=1;temp.y=1;temp.di=-1;
push(s,temp);
while(top!=NULL)//栈S不为空
{
getTop(s,temp);
x=temp.x;y=temp.y;di=temp.di+1;//从入口开始向前探索
while(di<4)//有路可走,依次往右下左上方向探索,选定一个方向
{
line=x+direct[di].incX;//下一单元的行坐标
col=y+direct[di].incY;//下一单元的列坐标
if(maze[line][col]==0)//下一单元可走
{
temp.x=x;temp.y=y;temp.di=di;
push(s,temp);//该单元三元组数据入栈
x=line;y=col;maze[line][col]=-1;//转到下一单元,可走故赋值为-1
if(x==8&&y==8)//如果下一单元走到终点
{
temp.x=x;temp.y=y;temp.di=-1;
push(s,temp);//终点单元三元组数据入栈
return 1;//走出迷宫
}
else di=0; //如果下一单元未走到终点,下一单元从右方向开始探索
}
else di++;//此方向不可走,下一个方向
}
if(di==4)//无路可走,其他方向要么是墙要么被走过,这条路是死路,退回
pop(s);
}
return 0;
}
int main()
{
int i,j;
int maze[10][10]= {
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}};//地图
cout<<"迷宫图(0的位置可走,1的位置为为墙)"<