迷宫问题实验报告用栈解决迷宫问题Word格式.docx
《迷宫问题实验报告用栈解决迷宫问题Word格式.docx》由会员分享,可在线阅读,更多相关《迷宫问题实验报告用栈解决迷宫问题Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
则{
删去栈顶位置;
若栈不空,则重新测试新的栈顶位置,直至找到一个可通的相邻块或出栈至栈空。
}while(栈不空)
三.详细设计
栈的设计:
typedefstruct
{
Node*base,*top;
intlength;
}Stack;
Stack*initstack();
//初始化栈
voidprintstack(Stack*s);
//打印栈
Statusdestroy(Stack*);
//销毁整个栈
Statusdeltop(Stack*s);
//出栈
Statuspushelem(Stack*,ElemType,ElemType);
//进栈
1.主程序模块:
intmain()
printf("
12的迷宫,X字符表示障碍,空符表示通路:
\n"
);
Mazea[N][N];
makemaze(a);
输入回车键显示路径,*字符表示路径。
getchar();
findpath(a);
while
(1);
return0;
2.迷宫生产模块;
voidmakemaze(Maze(*p)[N])
inti,j,conter;
for(i=0;
i<
N;
++i)
for(j=0;
j<
++j)
{
(*(p+i)+j)->
pos=0;
freq=0;
move[0]=0;
move[1]=0;
move[2]=0;
move[3]=0;
}
(*p+j)->
pos='
X'
;
(*(p+N-1)+j)->
for(i=1;
N-1;
(*(p+i))->
(*(p+i)+N-1)->
srand((int)time(NULL));
for(conter=0;
conter<
20;
++conter)
i=rand()%(N-2);
j=rand()%(N-2);
if(i==1&
&
j==1||i==N-1&
j==N-1)
printmaze(p);
3.路径查找模块。
Maze*testnewpos(Maze(*p)[N],Stack*s,int*i,int*j)
Maze*q=NULL;
intselect=0;
*i=*j=0;
for(;
q==NULL&
select<
4;
++select)//在可行的方向上只选一个
switch(select)
case0:
if((*(p+s->
top->
x)+s->
y)->
move[0]!
=1)
(*(p+s->
move[0]=1;
q=*(p+s->
y+1;
*i=s->
x+0;
*j=s->
}//退回前一步检查东方向是否可通
break;
case1:
move[1]!
move[1]=1;
x+1)+s->
y;
*i=s->
x+1;
y+0;
}//退回前一步检查南方向是否可通
case2:
move[2]!
move[2]=1;
y-1;
}//退回前一步检查西方向是否可通
case3:
move[3]!
move[3]=1;
x-1)+s->
x-1;
}//退回前一步检查北方向是否可通
returnq;
voidprintpath(Stack*s,Maze(*p)[N])
Node*n;
inti,j,conter;
conter=0;
n=s->
base;
n;
n=n->
next)
(*(p+n->
x)+n->
*'
for(i=0;
for(j=0;
++conter;
printf(FORMAT,(*(p+i)+j)->
pos);
if(conter%12==0)TURNLINE;
TURNLINE;
完整的程序:
maze.h
#ifndefMAZE_H
#defineMAZE_H
#include"
mazepath.h"
#include<
time.h>
#defineN12//10+2
#defineFORMAT"
%2c"
#defineTURNLINEprintf("
)
typedefstruct
charpos;
intfreq;
intmove[4];
}Maze;
voidmakemaze(Maze(*p)[N]);
voidprintmaze(Maze(*p)[N]);
voidfindpath(Maze(*p)[N]);
Maze*testnewpos(Maze(*p)[N],Stack*,int*,int*);
voidprintpath(Stack*s,Maze(*p)[N]);
voidmakemaze(Maze(*p)[N])
voidprintmaze(Maze(*p)[N])
voidfindpath(Maze(*p)[N])
Maze*q=NULL;
inti=1,j=1,*pi=&
i,*pj=&
j,success=0;
Stack*s;
s=initstack();
//初始化用来存储路径的栈
q=*(p+1)+1;
//初始化当前位置为入口位置
do
if(q->
pos!
='
!
(q->
freq))//当前位置通且在当前路径中未被访问过,则入栈
if(i==N-2&
j==N-2)
pushelem(s,N-2,N-2);
success=1;
elseif(i==1&
j==1)
pushelem(s,i,j);
q->
freq=1;
//当前位置已经进栈,作标记,不能再入栈,不然就只能兜死胡同了
//切换下一位置为东邻位置,并做标记,东邻位置已经使用
i=s->
j=s->
q=*(p+i)+j;
else
else//当前位置不通,则在前一步(栈顶)检查是否有其他方向可行
//printf("
stephere..."
if(s->
base!
=s->
top)
do//查找新的通路直到新通路出现或者回到初始位置
{
q=testnewpos(p,s,&
i,&
j);
//返回其它三个方向的其中一个和新的当前位置的坐标
if(q==NULL)deltop(s);
//栈顶没有可继续往下走的通路,删除栈顶,在新的栈顶找
}while(q==NULL&
s->
top);
}while(success!
=1);
printpath(s,p);
*j=s->
#endif
mazepath.h
#ifndefMAZEPATH_H
#defineMAZEPATH_H
#include<
stdio.h>
stdlib.h>
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintElemType;
typedefintStatus;
typedefstructnode
ElemTypex;
ElemTypey;
structnode*next;
structnode*prior;
}Node,*Postion;
Stack*initstack()
Stack*s;
s=(Stack*)malloc(sizeof(Stack));
if(!
s)returnERROR;
base=s->
top=NULL;
//栈空
length=0;
returns;
voidprintstack(Stack*s)
Node*N;
N=s->
N=N->
%2d%2d"
N->
x,N->
y);
printf("
\n\n"
Statusdestroy(Stack*s)
Node*p;
p=s->
while(s->
base->
s->
next;
//N=N->
next和free(P)不能倒换位置,当释放p时,
free(p);
//如果不将N移向下一个位置,将导致N指向的内存释放,N->
next不再有效
p=s->
returnOK;
Statusdeltop(Stack*s)
length)
Underflow\n"
//已经是空栈
else
top;
top=p->
prior;
--s->
length;
next=NULL;
}
Statuspushelem(Stack*s,ElemTypei,ElemTypej)
Node*n;
n=(Node*)malloc(sizeof(Node));
n)returnERROR;
n->
x=i;
y=j;
if(s->
length==0)
top=n;
n->
prior=NULL;
prior=s->
next=n;
++s->
MyMain.cpp
maze.h"
intmain()
四.调试结果及说明
1.说明:
本程序的运行环境为VC++6.0,执行文件为MgProblem.exe。
2.测试结果
实际程序执行过程如下图所示: