目的:掌握栈在求解迷宫问题中的应用。
内容:编写一个程序,输出迷宫的所有路径,并求第一条最短路径长度及最短路径。
代码如下:
#include
#include
#include
#include
using namespace std;
#define inf 0x3f3f3f
const int MaxSize=1000;
int M=4,N=4;
int mg[6][6]={{1,1,1,1,1,1},{1,0,0,0,1,1},
{1,0,1,0,0,1},{1,0,0,0,1,1},
{1,1,0,0,0,1},{1,1,1,1,1,1}};
int vis[6][6];
typedef struct
{
int i;//当前方块的行号
int j;//当前方的列号
int di;
}Box;
typedef struct
{
Box data[MaxSize];
int top;//栈顶指针
}SqStack;//顺序栈类型
void InitStack(SqStack *&s)//初始化栈
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}
bool Push(SqStack *&s,Box e)//进栈
{
if(s->top==MaxSize-1)
return false;
s->top++;
s->data[s->top]=e;
}
bool StackEmpty(SqStack *s)//判断栈是否为空
{
return (s->top==-1);
}
bool Pop(SqStack *&s,Box &e)//出栈
{
if(s->top==-1)
return false;
e=s->data[s->top];
s->top--;
return true;
}
bool GetTop(SqStack *s,Box &e)//取出栈顶元素
{
if(s->top==-1)
return false;
e=s->data[s->top];
return true;
}
bool mgpath(int xi,int yi,int xe,int ye)
{
int minn=inf,minum;
int cont=1;
int f=0;
int i,j,di,i1,j1,k;
bool _find=false;
SqStack *st;//定义栈st
InitStack(st);//初始化栈st
Box e1,e;
e1.i=xi;
e1.j=yi;
e1.di=-1;
Push(st,e1);//方块e进栈
vis[xi][yi]=-1;//将入口的迷宫值置为-1,避免重复走到该方块
while(!StackEmpty(st))//栈不为空时循环
{
GetTop(st,e);
//cout<toptop;
minum=cont;
}
printf("迷宫路径%d为:\n",cont++);
for(k=0;k<=st->top;k++)
printf("(%d,%d)\t",st->data[k].i,st->data[k].j);
printf("\n");
}
_find=false;
while(di<4&&!_find)
{
di++;
switch(di)
{
case 0:i1=i-1;j1=j;break;
case 1:i1=i;j1=j+1;break;
case 2:i1=i+1;j1=j;break;
case 3:i1=i;j1=j-1;break;
}
if(vis[i1][j1]==0&&mg[i1][j1]==0) _find=true;
}
if(_find)
{
st->data[st->top].di=di;
e.i=i1;
e.j=j1;
e.di=-1;
Push(st,e);
vis[i1][j1]=-1;
}
else
{
Pop(st,e);
vis[e.i][e.j]=0;
}
}
if(f==1)
{
printf("最短路径为路径%d\n",minum);
printf("最短路径长度为%d\n",minn);
return true;
}
return false;
}
int main()
{
if(!mgpath(1,1,4,4))
printf("该迷宫问题没有解!\n");
return 0;
}
运行结果: