迷宫问题说明书Word下载.docx
《迷宫问题说明书Word下载.docx》由会员分享,可在线阅读,更多相关《迷宫问题说明书Word下载.docx(31页珍藏版)》请在冰豆网上搜索。
typedefstruct{
intord;
//通道块在路径上的“序号”
PosTypeseat;
//通道块在迷宫中的“坐标位置”
intdi;
//从此通道块走向下一通道块的“方向”
//栈的元素类型
StatusMazePath(MazeTypemaze,PosTypestart,PosTypeend){
//若迷宫maze中存在从入口start到出口end的通道,则求得一条存放在栈中(从栈底到栈顶),并返回TURE;
否则返回FALSE
Initstack(s);
curpos=start;
//设定“当前位置”为“入口位置”
curtep=1;
//探索第一步
do{
if(Pass(curpos)){//当前位置可以通过,即是未曾走到过的通道块
Footprint(curpos);
//留下足迹
e=(curstep,curpos,1);
Push(S,e);
//加入路径
If(curpos==end)
return(TRUE);
//到达终点(出口)
curpos=NextPos(curpos,1);
//下一位置是当前位置的东邻
curstep++;
//探索下一步
}//if
else{//当前位置不能通过
if(!
StackEmpty(s)){
Pop(S,e);
While(e.di==4&
&
!
StackEmpty(S)){
MarkPrint(e.seat);
//留下不能通过的标记,并退回一步
}//while
if(e.di<
4){
e.di++;
//换下一个方向探索
curpos=NextPos(e.seate.di);
//设定当前位置是该新方向上的相邻块
}//if
}//else
}while(!
StackEmpty(S));
return(FALSE);
}//MazePath
3.函数的调用关系图
4.调试分析
a.迷宫行列数非法时,有提示但无法返回重新输入;
用二元组表示通路路径时,出口没显示。
b、算法的时间复杂度和空间复杂度:
空间复杂度:
O
(1).
时间复杂度:
随机生成迷宫:
O(n*n);
探寻出口:
O(n*n);
输出迷宫:
判断当前位置可通:
5.测试结果
1.进入欢迎界面:
2.选择手动生成:
3.选择自动生成:
4.生成结果:
5.无通路输出:
6.有通路及路径输出:
6.源程序(带注释)
#include<
stdio.h>
malloc.h>
stdlib.h>
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
#definem100
#definen100
typedefintMazeType[m+2][n+2];
MazeTypeMaze;
intcurstep=1;
//顺序栈
voidshoudong_Maze(inta,intb)
inti,j;
printf("
\n\n"
);
请按行输入迷宫,0表示通路,1表示障碍:
for(j=0;
j<
b+2;
j++)//定义周边值为1(同墙)
{
Maze[0][j]=1;
//迷宫上面行的周边即上边墙
Maze[a+1][j]=1;
//迷宫下面行的周边即下边墙
}
for(i=1;
i<
a+1;
i++)
Maze[i][0]=1;
//迷宫左边列的周边即左边墙
Maze[i][b+1]=1;
//迷宫右边列的周边即右边墙
请输入迷宫内墙单元数:
\n"
=a;
for(j=1;
=b;
j++)
scanf("
%d"
&
Maze[i][j]);
}
voidzidong_Maze(intc,intd)
d+2;
Maze[c+1][j]=1;
c+1;
Maze[i][d+1]=1;
\n迷宫生成中……\n\n"
system("
pause"
=c;
=d;
Maze[i][j]=rand()%2;
voiddisplayMaze(intf,intk)
\n迷宫生成结果如下:
for(i=0;
f+2;
for(j=0;
k+2;
j++)
printf("
Maze[i][j]);
printf("
用方格显示迷宫矩阵如下:
{
if(Maze[i][j]==0)printf("
□"
if(Maze[i][j]==1)printf("
■"
}
boolInitStack(SqStack*S)
(*S).base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
(*S).base)
exit(0);
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
returntrue;
boolStackEmpty(SqStackS)
if(S.top==S.base)
returntrue;
else
returnfalse;
boolPush(SqStack*S,SElemTypee)
if((*S).top-(*S).base>
=(*S).stacksize)
(*S).base=(SElemType*)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
exit(0);
(*S).top=(*S).base+(*S).stacksize;
(*S).stacksize+=STACKINCREMENT;
*((*S).top)++=e;
boolPop(SqStack*S,SElemType*e)
if((*S).top==(*S).base)
*e=*--(*S).top;
boolPass(PosTypecurpos)
if(Maze[curpos.x][curpos.y]==0)
voidFootPrint(PosTypecurpos)
Maze[curpos.x][curpos.y]=curstep;
PosTypeNextPos(PosTypecurpos,intdi)
PosTypefangxiang[4]={{0,1},{1,0},{0,-1},{-1,0}};
//(右下左上即东南西北)各方向的变量
curpos.x+=fangxiang[di].x;
curpos.y+=fangxiang[di].y;
returncurpos;
voidMarkPrint(PosTypecurpos)
Maze[curpos.x][curpos.y]=-1;
//将下一位置不通的当前位置标记为-1
intMazePath(PosTypestart,PosTypeend)
{
SqStackS;
PosTypecurpos;
SElemTypee;
InitStack(&
S);
curpos=start;
do
if(Pass(curpos))
//当前位置可以通过,即是未曾走到过的通道块
FootPrint(curpos);
//留下足迹
e.ord=curstep;
e.seat.x=curpos.x;
e.seat.y=curpos.y;
e.di=0;
Push(&
S,e);
//入栈当前位置及状态
curstep++;
//足迹加1
if(curpos.x==end.x&
curpos.y==end.y)//到达终点(出口)
return1;
curpos=NextPos(curpos,e.di);
迷宫路径用二元组表示如下:
(%d,%d)\n"
e.seat.x,e.seat.y);
else
//当前位置不能通过
if(!
StackEmpty(S))
{
Pop(&
S,&
e);
//退栈到前一位置
curstep--;
//前一位置处于最后一个方向(北)
while(e.di==3&
{
MarkPrint(e.seat);
//留下不能通过的标记(-1)
Pop(&
//退回一步
curstep--;
}
if(e.di<
3)//没到最后一个方向(北)
e.di++;
//换下一个方向探索
Push(&
curstep++;
//设定当前位置是该新方向上的相邻块
curpos=NextPos(e.seat,e.di);
}
}while(!
return0;
voidprintPath(intg,inth)//显示能求解的迷宫求解后的迷宫结构
用curstep步骤显示求解迷宫路径如下:
g+2;
h+2;
迷宫通路(用☆表示)如下所示:
if(Maze[i][j]==0||Maze[i][j]==-1)printf("
if(Maze[i][j]>
1)printf("
☆"
voidmenu()
charchoice;
intt,z;
PosTypestart,end;
**************************************************************\n"
*迷宫问题求解*\n"
*可选操作*\n"
*1.手动生成迷宫(请键入1)*\n"
*2.自动生成迷宫(请键入2)*\n"
*3.退出迷宫求解程序(请键入3)*\n"
请选择(1,2,3):
"
scanf("
choice);
switch(choice)
case1:
请输入迷宫的行数(不含外墙):
t);
请输入迷宫的列数(不含外墙):
z);
if((0<
t&
t<
=80)&
(0<
z&
z<
=80))
输入数据合法,程序继续......\n"
输入行列数据超出迷宫最大范围(或者输入数据不合法),请重新输入行列数:
shoudong_Maze(t,z);
displayMaze(t,z);
请输入迷宫入口(用坐标表示即x空格y):
scanf("
%d%d"
start.x,&
start.y);
请输入迷宫出口(用坐标表示即x空格y):
end.x,&
end.y);
if(MazePath(start,end))
printPath(t,z);
else
printf("
此迷宫没有从入口到出口的通路!
menu();
break;
case2:
zidong_Maze(t,z);
case3:
谢谢使用!
break;
default:
选择选项输入错误!
请重新输入:
menu();
break;
voidmain()
{menu();
总结
在这两周的数据结构课程设计中,我的题目是:
迷宫问题,这两周课程设计中,通过该题目的设计过程,我加深了对栈的逻辑结构,存储结构及入栈出栈过程的理解,对栈的基本运算的实现有所掌握,对课本中所学的各种数据结构进一步理解和掌握,学会了如何把学到的知识用于解决实际问题,锻炼了自己动手的能力。
一个人要完成所有的工作是非常困难和耗时的。
在以后的学习中我会更加注意各个方面的能力的协调发展。
在课程设计时遇到了很多的问题,在老师的帮助,和对各种资料的查阅中,将问题解决,培养了我自主动手,独立研究的能力,为今后在学习中能更好的发展打下了坚实的基础。
二周的课程设计很短暂,但其间的内容是很充实的,在其中我学习到了很多平时书本中无法学到的东西,积累了经验,锻炼了自己分析问题,解决问题的能力,并学会了如何将所学的各课知识融会,组织,来配合学习。
参考文献
1严蔚敏,吴伟民.《数据结构(C语言版)》.清华大学出版社.
2严蔚敏,吴伟民.《数据结构题集(C语言版)》.清华大学出版社.
3《DATASTRUCTUREWITHC++》.WilliamFord,WilliamTopp.清华大学出版社(影印版).
4谭浩强.《c语言程序设计》.清华大学出版社.
5.数据结构与算法分析(Java版),APracticalIntroductiontoDataStructuresandAlgorithmAnalysisJavaEditionCliffordA.Shaffer,张铭,刘晓丹译电子工业出版社2001年1月
致谢
在课程设计的过程中,我得到了老师和同学们的热情帮助。
没有他们的帮助,我就无法顺利完成自己的课设任务。
在此,首先要感谢我的指导老师——张永老师。
我的同学在程序调试的初期给了我很大帮助,没有他们的帮助,我很难发现一些潜在的错误,在此对他们表示一并的感谢。
附件Ⅰ任务一源程序代码