数据结构课程设计 迷宫问题.docx
- 文档编号:24587403
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:17
- 大小:91.92KB
数据结构课程设计 迷宫问题.docx
《数据结构课程设计 迷宫问题.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计 迷宫问题.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构课程设计迷宫问题
目录
1.功能描述(或设计目标)4
2.总体设计(或概要设计)6
2.1数据结构描述与定义8
2.2模块设计9
3.测试结果与分析10
4.课程设计总结12
参考文献:
13
附录:
14
1.功能描述(或设计目标)
课程设计选题的目的
为大家解决一些生活中实际的问题,在这个过程中,自身的能力也在不断地提高。
此次程序设计综合运用所学知识解决实际问题,将课堂的书本知识有效的在程序中体现出来,让学生更理解C++功能之强大,进一步让学生对面向对象的方法以及C++的编程思想有较好的了解和认识。
此外,此次设计培养独立开发、设计、调试、运行程序的能力,激发学生较强的自学兴趣,锻炼学生之间以及学生与老师的沟通能力,培养学生之间的合作精神,让彼此更好的认识到合作的重要性,使学生在今后的学习中加强对合作精神的培养。
课程设计选题的背景和意义
课程设计的背景
儿童智力游戏的一种,同时也锻炼人的思维能力。
当我们在一个迷宫中时怎样避免重复的走一些路,避免怎样走投无路,无路可走,什么样的迷宫可走,怎样就知道迷宫无出口了,通过回溯法帮我们解答,动脑子想办法,看看计算机是怎么实现以最快的方式走出你设的迷宫的。
课程设计的意义
一般来说,课程设计要比教学实验复杂一些,涉及的深度深,而且更加实用些。
其目的是通过课程设计的综合训练,培养学生分析解决实际问题和编程等动手能力,最终目标是想通过这种形式,帮助学生系统掌握C++这门课程的主要内容,使老师更好的完成教学任务。
结合实际应用的要求,使课程设计既覆盖教学所要求的知识点,又接近工程的实际需要,训练自己实际分析问题和解决问题以及编程的能力。
通过详细的实例分析,循环渐进的描述,启发学生顺利的完成设计。
课程设计将设计要求、需求分析、算法设计、编程和实例测试运行分开,为学生创造分析问题、独立思考的条件。
只要学生在吃透要求和算法的前提下,完全可以不按书中提示的参考程序,自己设计出更具有特色的程序。
2.总体设计(或概要设计)
设计思想
迷宫中用回溯法从八个方向向前试探,用队列保存探测到的通路,建立一个数组模拟迷宫,将各个函数结合在一起。
迷宫中定义move数组,从东顺时针探测;进队出队完成探测;自己创建maze数组,并输入入口点和出口点,再进行计算。
详细的设计过程
实现定义操作伪代码算法
求一般路径伪代码:
while(栈不空)
{
栈顶元素=>(x,y,d)
出栈;
求出下一个要试探的方向d++;
while(还有剩余试探方向)
{
if(d方向可走)
{
(x,y,d)入栈;
求新点坐标(i,j);
将新点(i,j)切换成当前点(x,y);
if((x,y)==(m,n))
结束;
else
重置d=0;
}
elsed++;
}
}
求解最短路径伪代码:
(x,y)入队;
while(队列不为空)
{
队首元素出队;
for(方向为0;方向<总方向数;改变方向)
{
到达点坐标;
if(此坐标点为通路)
入队;
if(到达出口点)
{
输出路径;
恢复迷宫;
}
}
当前点搜索完,取下一点搜索;
}
2.1数据结构描述与定义
实现定义的数据类型
(1)迷宫数组定义为结构体包含两个整型数据,迷宫出口和入口的值定义为整型。
(2)迷宫内部的设计时各坐标点设置成栈内整型。
(3)迷宫中求最短路径时定义结构体类型表示队列,包含整型坐标点,和整型下标;又有整型的队首尾指针。
结构体定义
typedefstruct
{
intx,y;
}item;
typedefstruct
{
intx,y,d;
}Datetype;
typedefstruct{
intx,y;//所到点的坐标;
intpre;//前驱点的下标;
}SqType;//队列;
2.2模块设计
程序流程图
设计思路
在程序设计过程中,大约是按照几个步骤进行的,主要包括:
方向设置,路径存储,迷宫图的存储,路径的求解,出口入口的设置。
迷宫问题中,主要依据c++语言和数据结构的相关知识进行设计的,采用move数组存储方向,采用二维数组存储迷宫图,采用栈存储路径,采用队列算出最短路径,参数传递出口入口和迷宫的大小。
迷宫问题中,突出优点为采用了时间随机函数,系统自动生成迷宫,节约用户时间。
此外,用两种不同的存储方式(栈和队列)对迷宫进行探究。
界面清晰、通俗易懂、操作简便、结构严谨、逻辑习惯强。
3.测试结果与分析
按系统功能描述(设计目标)测试软件运行是否正确,测试数据的选择要代表性,列出所有测试用的输入数据和相应的输出数据以及测试结果。
4.课程设计总结
程序中的不足
对于迷宫问题,输入迷宫内部结构时,输入形式为0、1空格或回车,输入形式有误时,会使程序无法运行下去,有时还会进入死循环。
输入入口坐标时,没有容错,若大于迷宫规模,程序会出错。
可改进的地方
(1)各个菜单界面可以设计的更为美观,更简洁易懂。
(2)可以从各个方面考虑设置容错机制使程序更健壮。
总结
课程设计中感受到自己知识的匮乏,需要学习的东西很多,不能总是局限于书本,在课程设计中出现问题时,应该及时与周围同学交流,多交流才能使学到的东西更深入到心里,总之,这是一次不错的锻炼,专业水平不说能提高什么,但在过程中学到的学习方法应该是能受益终生的!
在心里总是想感谢几个人,在课程设计过程中,由于自己时间安排不当与专业基础知识的不扎实,课程设计的时间总是感觉不够,在课程设计中也遇到了很多困难,好多时候都想止步不前,但因为有身边的这群人,帮助我度过难关,有的鼓励我,有的引导我,我也渐渐放平心境,学会怎么去思考,怎么去解决遇到的问题,怎么让程序运行起来,其实我们都是学生,但是他们比我做的好,我应该向他们学习,学习面对困难的态度与理智,学习坚韧的品行……课程设计结束了,但感觉收获了很多,不仅仅是任务完成了,更让我了解到身边这群值得我珍惜的朋友是多么的难得。
这仅仅是一个小小的课程设计,以后还要面对各种各样的更大的困难与逆境,只要坚持,找到正确的方法,相信一切都会克服的。
参考文献:
1.严蔚敏,吴伟民.数据结构(C语言版).北京:
清华大学出版社,1997
2.朱战立.数据结构.西安:
西安电子科技大学出版社,2004
3.严蔚敏,吴伟民.数据结构题集(C语言版).北京:
清华大学出版社,2000
附录
源代码
#include
#include
#include
#include
#include
usingnamespacestd;
typedefstruct
{
intx,y;
}item;
typedefstruct
{
intx,y,d;
}Datetype;
typedefstack
voidpath(int**maze,int,int,int,int);
voidprintpath();
#defineNUM100//队列大小;
typedefstruct{
intx,y;//所到点的坐标;
intpre;//前驱点的下标;
}SqType;//队列;
intfront,rear;//队首指针与队尾指针;
voidprintpath(SqTypesq[],int){//打印路径
inti;
i=rear;
do{
cout<<"("< i=sq[i].pre;//回溯; }while(i! =-1); } voidrestore(int**maze,intm,intn){//恢复迷宫 for(inti=1;i<=m;i++){ for(intj=1;j<=n;j++){ if(maze[i][j]==-1) maze[i][j]=0; } } } intpath1(int**maze,intm,intn,intc,intd,intx1,inty1)//最短路径 {//m,n为迷宫的长和宽,c,d为迷宫入口坐标,x1,y1为迷宫出口坐标;maze为迷宫; itemmove[8]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};//坐标增量数组; SqTypesq[NUM]; intx,y,i,j,v; front=rear=0; sq[0].x=c; sq[0].y=d; sq[0].pre=-1; if(maze[c][d]==0) maze[c][d]=-1;//入口点入队; elsegotoG; while(front<=rear){//队列不为空 x=sq[front].x; y=sq[front].y; for(v=0;v<8;v++){ i=x+move[v].x; j=y+move[v].y; if(maze[i][j]==0){ rear++; sq[rear].x=i; sq[rear].y=j; sq[rear].pre=front; maze[i][j]=-1;//访问过的坐标点,入队; } if(i==x1&&j==y1){ cout<<"最短路径为: "< printpath(sq,rear);//输出路径; restore(maze,m,n);//恢复迷宫; return1; } }//forv; front++;//当前点搜索完,取下一个点搜索 }//while G: cout<<"无路径。 "< return0; } voidpath(int**maze,inta,intb,intm,intn) { itemmove[8]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; stack_intst; Datetypetemp; intx,y,d,i,j; if(maze[a][b]==1){cout<<"进口输入有误。 ";return;} temp.x=a;temp.y=b;temp.d=-1;//初始化入口点坐标及方向; st.push(temp); while(! st.empty()) { temp=st.top(); st.pop(); x=temp.x;y=temp.y;d=temp.d+1; while(d<8) { i=x+move[d].x;j=y+move[d].y; if(maze[i][j]==0)//该点可到达; { temp.x=x;temp.y=y;temp.d=d;//坐标及方向; st.push(temp);//坐标及方向入栈; x=i;y=j; maze[x][y]=-1;//到达新点; if(x==m&&y==n) { cout<<"迷宫路径为: "< cout<<"("< Datetypet; while(! st.empty()) { t=st.top(); cout<<"("< st.pop(); }//输出路径; cout< return;//到达出口; } elsed=0;//重新初始化方向; } elsed++;//改变方向; } } cout<<"对不起,无法找到出口."; return;//迷宫无路; } voidprintpath() { intm,n,i,j,l,c,d; strings; cout<<"请输入迷宫的行数列数如: (mn)"< cin>>m>>n; int**maze=newint*[m+2]; for(i=0;i<=m+1;i++) maze[i]=newint[n+2];//申请迷宫的空间; for(i=0;i<=m+1;i++) maze[i][0]=1; for(i=0;i<=n+1;i++) maze[0][i]=1; for(i=0;i<=m+1;i++) maze[i][n+1]=1; for(i=0;i<=n+1;i++) maze[m+1][i]=1;//建立迷宫周围的墙; cout<<"1、采用创建好的迷宫;2、自己创建迷宫(其他输入按'2'处理)"< cin>>s; if(s=="1") { srand(time(0));//系统时间随机函数; for(i=1;i<=m;i++) for(j=1;j<=n;j++) maze[i][j]=rand()%2;//随机赋值 maze[1][1]=0;//(1,1)点为可通过点; maze[m][n]=0;//(m,n)点为可通过点; } else { cout<<"请输入迷宫: "< for(i=1;i<=m;i++)//输入第i行迷宫的构造; for(j=1;j<=n;j++)//输入第j列迷宫的结构; { cin>>maze[i][j]; A: if(maze[i][j]! =0&&maze[i][j]! =1) { cout<<"请再次输入: "; cin>>maze[i][j];gotoA;//判错; } } } cout<<"迷宫如下: "< for(i=0;i<=m+1;i++) { for(j=0;j<=n+1;j++) cout< cout< } H: cout<<"请输入迷宫入口(a,b),出口(c,d): "; cin>>i>>j>>c>>d; path(maze,i,j,c,d);//调用路径函数,输出路径; cout< restore(maze,m,n);//恢复迷宫; path1(maze,m,n,i,j,c,d);//输出最短路径; cout< cout<<"1、寻找其他入口与出口;2、退出此迷宫;"; cin>>l; if(l==1){ restore(maze,m,n);//恢复迷宫; gotoH; } elsereturn;//跳出此函数; } voidmain() { strings="Y"; do { cout<<"--------------------------欢迎到达迷宫界面--------------------------\n"; printpath(); cout< cout<<"\n是否继续? 'Y'或'N'(输入其他操作按'N')"< cin>>s; }while(s=="Y"||s=="y"); system("pause");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课程设计 迷宫问题 数据结构 课程设计 迷宫 问题