数据结构上机实验报告迷宫求解文档格式.docx
- 文档编号:20171677
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:13
- 大小:17.96KB
数据结构上机实验报告迷宫求解文档格式.docx
《数据结构上机实验报告迷宫求解文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构上机实验报告迷宫求解文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
typedefstruct
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;
/*函数原型说明*/
StatusInitStack(SqStack&
S);
//创建一个空栈S
StatusPush(SqStack&
S,SElemType&
a);
//插入新元素a
StatusPop(SqStack&
//删除栈顶元素,a返回其值
StatusStackEmpty(SqStackS);
//检查是否空栈
StatusMazePath(intmaze[12][12],SqStack&
S,PosTypestart,PosTypeend);
//找通路
voidInitmaze(intmaze[12][12],intx,inty);
//初始化迷宫
voidprintmaze(intmaze[12][12],intx,inty);
//显示迷宫
StatusPass(intmaze[12][12],PosTypeCurPos);
//判断当前位置是否可通
voidMarkfoot(intmaze[12][12],PosTypeCurPos);
//标记当前位置不可通
PosTypeNextPos(PosTypeCurPos,intDir);
//进入下一位置
voidprintpath(intmaze[12][12],SqStackS,intx,inty,PosTypestart,PosTypeend);
//显示通路
/*主函数*/
voidmain(void)
PosTypestart,end;
intt=0;
SqStackS;
intmaze[12][12];
do{
if(t!
=0)
printf("
\n"
);
for(inti=0;
i<
20;
i++)
{
printf("
*"
}
if(t==0)
{
\n*\t欢迎来到迷宫世界\t*\n"
*\t1.设置迷宫\t\t*\n"
else
\n*请继续选择:
\t\t\t*\n"
*\t2.设置迷宫路径\t\t*\n"
*\t3.输出迷宫通路路径\t*\n"
*\t4.结束\t\t\t*\n"
t++;
for(intj=0;
j<
j++)
ints;
请选择:
"
scanf("
%d"
&
s);
intaa;
intx,y;
switch(s)
case1:
//1.初始化迷宫
aa=1;
迷宫设置:
请输入\n"
//设置迷宫大小
do
{
printf("
行X(x<
10)="
scanf("
x);
列Y(y<
y);
if(x<
1||x>
10||y<
1||y>
10)
{
printf("
输入错误!
}
}while(x<
10);
Initmaze(maze,x,y);
printmaze(maze,x,y);
//显示所创建的迷宫
break;
case2:
//寻找迷宫路径
if(aa==1)
aa=2;
//设置入口和出口
do{
输入入口行坐标:
scanf("
start.row);
if(start.row>
x)
printf("
}while(start.row>
输入入口列坐标:
start.line);
if(start.line>
y)
}while(start.line>
输入出口行坐标:
end.row);
if(end.row>
}while(end.row>
输入出口列坐标:
end.line);
if(end.line>
}while(end.line>
}
else
请先初始化迷宫!
\n所设置入口坐标为(%d,%d),出口坐标为(%d,%d).\n"
start.row,start.line,end.row,end.line);
case3:
//输出此迷宫通路路径
if(aa==2)
aa=3;
if(MazePath(maze,S,start,end))//若有通路,显示通路
printpath(maze,S,x,y,start,end);
else
\n抱歉,找不到通路!
\n\n"
请先初始化迷宫并寻找路径!
case4:
exit(0);
default:
exit(0);
}
}while
(1);
}
/*若迷宫maze中从入口start到出口end的通道,则求得一条存放在栈中*/
S,PosTypestart,PosTypeend)
{
PosTypecurpos;
intcurstep;
SElemTypee;
InitStack(S);
curpos=start;
//设定"
当前位置"
为"
入口位置
curstep=1;
//探索第一步
do{
if(Pass(maze,curpos))//当前位置可通过,即是未曾走到过的通道块
Markfoot(maze,curpos);
//留下足迹
e.di=1;
e.ord=curstep;
e.seat=curpos;
Push(S,e);
//加入路径
if(curpos.row==end.row&
&
curpos.line==end.line)
returnOK;
//到达终点(出口)
curpos=NextPos(curpos,1);
//下一位置是当前位置的东邻
curstep++;
//探索下一步
}
else//当前位置不能通过
{
if(!
StackEmpty(S))
Pop(S,e);
while(e.di==4&
!
Markfoot(maze,e.seat);
//留下不能通过的标记,并退回一步
}
if(e.di<
4)
e.di++;
//换下一个方向探索
Push(S,e);
curpos=NextPos(e.seat,e.di);
//当前位置设为新方向的相邻块
}
}while(!
StackEmpty(S));
returnERROR;
}
/*初始化迷宫时间复杂度:
n^2*/
voidInitmaze(intmaze[12][12],intx,inty)
charselect;
printf("
创建方式A:
自动生成B:
手动创建\n"
label:
scanf("
%c"
select);
if(select=='
a'
||select=='
A'
)//自动生成
{
for(inti=1;
x+1;
for(intj=1;
y+1;
maze[i][j]=rand()%2;
}
elseif(select=='
b'
B'
)//手动设置
按行输入%d*%d数据,0代表可通,1代表不可通(每行以Enter结束):
x,y);
scanf("
maze[i][j]);
maze[i][y+1]=1;
for(i=0;
x+2;
i++)maze[x+1][i]=1;
\n'
)gotolabel;
//排除Enter键的影响
else
if(select!
='
||select!
)
}while(select!
/*显示迷宫时间复杂度:
voidprintmaze(intmaze[12][12],intx,inty)
显示所建的迷宫(#表示墙):
%c"
'
#'
y'
for(intj=1;
%d"
j);
\nx"
for(inti=1;
y+3;
for(i=1;
{
if(i<
x+1)
i);
maze[i][j]);
}
for(i=0;
i++)printf("
printf("
/*输出路径时间复杂度:
voidprintpath(intmaze[12][12],SqStackS,intx,inty,PosTypestart,PosTypeend)
\n\n\001通路路径:
SElemType*p=S.base;
while(p!
=S.top)
maze[p->
seat.row][p->
seat.line]=2;
//标记为路径中的点
p++;
\001路径图为:
for(intm=1;
m<
m++)
if(i<
for(intj=1;
if(maze[i][j]==2)
{if(i==start.row&
j==start.line||i==end.row&
j==end.line){
if(i==start.row&
j==start.line)
i"
if(i==end.row&
j==end.line)
o"
'
else
for(i=0;
\001路径线路为:
SqStackM;
InitStack(M);
SElemTypea;
while(!
StackEmpty(S))
{
Pop(S,a);
Push(M,a);
StackEmpty(M))
Pop(M,a);
(%d,%d)"
a.seat.row,a.seat.line);
路径输出成功!
/*判断当前位置是否可通*/
StatusPass(intmaze[12][12],PosTypeCurPos)
if(maze[CurPos.row][CurPos.line]==0)
returnOK;
//如果当前位置是可以通过,返回1
else
returnERROR;
//其它情况返回0
/*标记当前位置不可通*/
voidMarkfoot(intmaze[12][12],PosTypeCurPos)
maze[CurPos.row][CurPos.line]=1;
/*进入下一位置*/
PosTypeNextPos(PosTypeCurPos,intDir)
PosTypeReturnPos;
switch(Dir)
case1:
ReturnPos.row=CurPos.row;
ReturnPos.line=CurPos.line+1;
break;
case2:
ReturnPos.row=CurPos.row+1;
ReturnPos.line=CurPos.line;
case3:
ReturnPos.line=CurPos.line-1;
ReturnPos.row=CurPos.row-1;
returnReturnPos;
/*创建一个空栈S*/
S)
S.base=(SElemType*)malloc(100*sizeof(SElemType));
if(!
S.base)returnERROR;
S.top=S.base;
S.stacksize=100;
returnOK;
/*插入新元素a*/
a)
*S.top++=a;
/*删除栈顶元素,a返回其值*/
if(S.top==S.base)returnERROR;
a=*--S.top;
/*检查是否空栈*/
StatusStackEmpty(SqStackS)
if(S.top==S.base)returnOK;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 上机 实验 报告 迷宫 求解