数据结构栈的应用(迷宫求解)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
栈的应用
迷宫求解
任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;
源代码:
#include
#include
/*数据定义*/
typedefenum { ERROR, OK } Status;
typedefstruct
{
int row; //row表示"行"号
int line; //line表示"列"号
}PosType; //位置的元素类型
typedefstruct
{
intord; //该通道在路径上的"序号"
PosType seat; //通道块在迷宫中的"坐标位置"
int di; //从此通道走向下以通道块的"方向"
}SElemType; //栈的元素类型
typedefstruct
{
SElemType * base;
SElemType * top;
intstacksize;
}SqStack;
/*函数原型说明*/
Status InitStack(SqStack&S); //创建一个空栈S
Status Push(SqStack&S,SElemType&a); //插入新元素a
Status Pop(SqStack&S,SElemType&a); //删除栈顶元素,a返回其值
Status StackEmpty(SqStack S); //检查是否空栈
Status MazePath(int maze[12][12],SqStack&S, PosType start, PosType end); //找通路
void Initmaze(int maze[12][12],intx,int y); //初始化迷宫
void printmaze(int maze[12][12],intx,int y); //显示迷宫
Status Pass(int maze[12][12],PosTypeCurPos); //判断当前位置是否可通
void Markfoot(int maze[12][12], PosTypeCurPos); //标记当前位置不可通
PosTypeNextPos(PosTy peCurPos, intDir); //进入下一位置
void printpath(int maze[12][12],SqStackS,intx,inty,PosTypestart,PosType end); //显示通路
/*主函数*/
void main (void)
{
PosTypestart,end;
int t=0;
SqStack S;
int maze[12][12];
do{
if(t!=0)
printf("\n");
for(int i=0;i<20;i++)
{
printf("* ");
}
if(t==0)
{
printf("\n*\t欢迎来到迷宫世界\t * \n");
printf("*\t 1.设置迷宫\t\t * \n");
}
else
{
printf("\n* 请继续选择:\t\t\t * \n");
printf("*\t 1.设置迷宫\t\t * \n");
}
printf("*\t 2.设置迷宫路径\t\t * \n");
printf("*\t 3.输出迷宫通路路径\t * \n");
printf("*\t 4.结束\t\t\t *\n");
t++;
for(int j=0;j<20;j++)
{
printf("* ");
}
printf("\n");
int s;
printf("请选择:");
scanf("%d",&s);
intaa;intx,y;
switch(s)
{
case 1://1.初始化迷宫
aa=1;
printf("迷宫设置:请输入\n"); //设置迷宫大小
do
{
printf("行X(x<10)=");
scanf("%d",&x);
printf("列Y(y<10)=");
scanf("%d",&y);
if(x<1 || x>10||y<1 || y>10)
{
printf("输入错误!\n");
}
}while(x<1 || x>10||y<1 || y>10);
Initmaze(maze,x,y); //初始化迷宫
printmaze(maze,x,y); //显示所创建的迷宫
break;
case 2://寻找迷宫路径
if(aa==1)
{
aa=2; //设置入口和出口
do{
printf("输入入口行坐标:");scanf("%d",&start.row);
if(start.row>x)
printf("输入错误!\n");
}while(start.row>x);
do{
printf("输入入口列坐标:");scanf("%d",&start.line);
if(start.line>y)
printf("输入错误!\n");
}while(start.line>y);
do{
printf("输入出口行坐标:");scanf("%d",&end.row);
if(end.row>x)
printf("输入错误!\n");
}while(end.row>x);
do{
printf("输入出口列坐标:");scanf("%d",&end.line);
if(end.line>y)
printf("输入错误!\n");
}while(end.line>y);
}
else
printf("请先初始化迷宫!\n");
printf("\n所设置入口坐标为(%d,%d),出口坐标为(%d,%d).\n",start.row,start.line,end.row,end.line);
break;
case 3://输出此迷宫通路路径
if(aa==2)
{
aa=3;
if(MazePath(maze,S,start,end)) //若有通路,显示通路
printpath(maze,S,x,y,start,end);
else
printf("\n抱歉,找不到通路!\n\n");