ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:143.48KB ,
资源ID:12351905      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12351905.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构 迷宫求解问题 课程设计.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构 迷宫求解问题 课程设计.docx

1、数据结构 迷宫求解问题 课程设计江西理工大学应用科学学院 数据结构课程设计报告题目: 迷宫求解 班级: 姓名: 学号: 完成日期: 一、课程设计概述.2二、问题描述. 2三、需求分析. 2四、概要设计. 2 五、存储结构. 4六、流程图 . 4 七、详细设计. 4八、调试分析.8九、运行结果及分析. 8十、参考文献. 10十一、主程序.10一、课程设计概述本次数据结构课程设计主要完成用栈来实现迷宫求解问题。 使用语言:C编译环境:VC6.0二、问题描述迷宫问题是取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒子中设置了许多墙,对行进方向形成了多处阻挡。盒子仅有一个

2、出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。对同一只老鼠重复进行上述实验,一直到老鼠从入口走到出口,而不走错一步。老鼠经过多次试验最终学会走通迷宫的路线。设计一个计算机程序对任意设定的矩形迷宫如下图A所示,求出一条从入口到出口的通路,或得出没有通路的结论。 图1-1.三、需求分析要求设计程序输出如下:(1) 建立一个大小为mn的任意迷宫(迷宫数据可由用户输入或由程序自动生成),并在屏幕上显示出来;(2)找出一条通路的二元组(i,j)数据序列,(i,j)表示通路上某一点的坐标。(3)用一种标志(如数字8)在迷宫中标出该条通路;(4)在屏幕上输出迷宫和通路;(5)上述功能可用菜

3、单选择。四、概要设计设定栈的抽象数据类型定义为:ADT stack数据对象:D=ai|aicharset,i=1,2,n,n0数据关系:R1=|ai-1,aiD,i=2,n基本操作:InitStack(&S)/操作结果:构造一个空栈S。DestroyStack(&S)/初始条件:栈S已存在。/操作结果:销毁栈S。ClearStack(&S)/初始条件:栈S已存在。/操作结果:将S清为空栈。StackLength(&S)/初始条件:栈S已存在。/操作结果:返回栈S的长度。StackEmpty(&S)/初始条件:栈S已存在。/操作结果:若S为空栈,则返回TRUE,否则返回FALSE。GetTop(

4、S,&e)/初始条件:栈S已存在。/操作结果:若栈S不空,则以e返回栈顶元素。Push(&S,e)/初始条件:栈S已存在。/操作结果:在栈S的栈顶插入新的栈顶元素e。Pop(&S,&e)/初始条件:栈S已存在。/操作结果:删除S的栈顶元素,并以e返回其值。StackTraverse(S,visit( )/初始条件:栈S已存在。/操作结果:从栈底到栈顶依次对S中的每个元素调用函数visit( ).ADTstack五存储结构struct point int row; /通道块在路径上的“行”位置 int col; /迷宫的“出口”I nt predecessor; /该通道的“前趋”queue51

5、2;六、流程图图1-2七、详细设计实现概要设计中定义的所有数据类型及操作的伪代码算法1.节点类型和指针类型迷宫矩阵类型:int mazeM+2N+2;为方便操作使其为全局变量迷宫中节点类型及队列类型:struct pointint row,col,predecessor que5122.迷宫的操作(1)手动生成迷宫void shoudong_maze(int m,int n)定义i,j为循环变量for(i=m)for(j=n)输入mazeij的值(2)自动生成迷宫void zidong_maze(int m,int n)定义i,j为循环变量for(i=m)for(j=n)mazeij=rand

6、()%2 /由于rand()产生的随机数是从0到RAND_MAX,RAND_MAX是定义在stdlib.h中的,其值至少为32767),要产生从X到Y的数,只需要这样写:k=rand()%(Y-X+1)+X;(3)打印迷宫图形void print_maze(int m,int n)用i,j循环变量,将mazeij输出 、(4)打印迷宫路径void result_maze(int m,int n)用i,j循环变量,将mazeij输出 、(5)搜索迷宫路径迷宫中队列入队操作void enqueue(struct point p)将p放入队尾,tail+迷宫中队列出队操作struct point d

7、equeue(struct point p)head+,返回quehead-1判断队列是否为空int is_empty()返回head=tail的值,当队列为空时,返回0访问迷宫矩阵中节点void visit(int row,int col,int maze4141)建立新的队列节点visit_point,将其值分别赋为row,col,head-1,mazerowcol=2,表示该节点以被访问过;调用enqueue(visit_point),将该节点入队路径求解void mgpath(int maze4141,int m,int n)先定义入口节点为struct point p=0,0,-1,

8、从maze00开始访问。如果入口处即为障碍,则此迷宫无解,返回0 ,程序结束。否则访问入口节点,将入口节点标记为访问过mazep.rowp.col=2,调用函数enqueue(p)将该节点入队。判断队列是否为空,当队列不为空时,则运行以下操作: 调用dequeue()函数,将队头元素返回给p,如果p.row=m-1且p.col=n-1,即到达出口节点,即找到了路径,结束如果p.col+1n且mazep.rowp.col+1=0,说明未到迷宫右边界,且其右方有通路,则visit(p.row,p.col+1,maze),将右边节点入队标记已访问如果p.row+10且mazep.rowp.col-1

9、=0,说明未到迷宫左边界,且其左方有通路,则visit(p.row,p.col-1,maze),将左方节点入队标记已访问如果p.row-10且mazep.row-1p.col=0,说明未到迷宫上边界,且其上方有通路,则visit(p.row,p.col+1,maze),将上方节点入队标记已访问访问到出口(找到路径)即p.row=m-1且p.col=n-1,则逆序将路径标记为3即mazep.rowp.col=3;while(p.predecessor!=-1)p=queuep.predecessor; mazep.rowp.col=3; 最后将路径图形打印出来。3.菜单选择while(cycle

10、!=(-1) 手动生成迷宫 请按:1 自动生成迷宫 请按:2 退出 请按:3 scanf(%d,&i); switch(i) case 1:请输入行列数(如果超出预设范围则提示重新输入) shoudong_maze(m,n); print_maze(m,n); mgpath(maze,m,n);if(X!=0) result_maze(m,n);case 2 :请输入行列数(如果超出预设范围则提示重新输入) zidong_maze(m,n);print_maze(m,n);mgpath(maze,m,n); if(X!=0) result_maze(m,n);case 3:cycle=(-1)

11、; break;注:具体源代码见附录八、调试分析在调试过程中,首先使用的是栈进行存储,但是产生的路径是多条或不是最短路径,所以通过算法比较,改用此算法。九、运行结果及分析 1.程序主界面 图1-32.手动输入迷宫图1-4图1-53.自动生成迷宫图1-6图1-7十、参考文献1浩谭强.C程序设计M第2版.北京:清华大学出版社,2004年。2蔚严敏、吴伟民.数据结构M.北京:清华大学出版社,2OO5年。十一、主程序附录:#includestdlib.h#includestdio.h#define N 39#define M 39int X;int mazeN+2M+2;struct point in

12、t row,col,predecessor;queue512;int head=0,tail=0;void shoudong_maze(int m,int n) int i,j; printf(nn); printf(请按行输入迷宫,0表示通路,1表示障碍:nn); for(i=0;im;i+) for(j=0;jn;j+) scanf(%d,&mazeij);void zidong_maze(int m,int n) int i,j; printf(n迷宫生成中nn); system(pause); for(i=0;im;i+) for(j=0;jn;j+) mazeij=rand()%2;

13、/由于rand()产生的随机数是从0到RAND_MAX/RAND_MAX是定义在stdlib.h中的,其值至少为32767)/要产生从X到Y的数,只需要这样写:k=rand()%(Y-X+1)+X; void print_maze(int m,int n) int i,j; printf(n迷宫生成结果如下:nn); printf(迷宫入口n); printf(); for(i=0;im;i+) printf(n); for(j=0;jn;j+) if(mazeij=0) printf(); if(mazeij=1) printf(); printf(迷宫出口n);void result_ma

14、ze(int m,int n) int i,j; printf(迷宫通路(用表示)如下所示:nt); for(i=0;im;i+) printf(n); for(j=0;jn;j+) if(mazeij=0|mazeij=2) printf(); if(mazeij=1) printf(); if(mazeij=3) printf(); void enqueue(struct point p) queuetail=p; tail+;struct point dequeue() head+; return queuehead-1;int is_empty() return head=tail;v

15、oid visit(int row,int col,int maze4141) struct point visit_point=row,col,head-1; mazerowcol=2; enqueue(visit_point);int mgpath(int maze4141,int m,int n) X=1; struct point p=0,0,-1; if(mazep.rowp.col=1)printf(n=n);printf(此迷宫无解nn);X=0;return 0; mazep.rowp.col=2; enqueue(p); while(!is_empty() p=dequeue

16、(); if(p.row=m-1)&(p.col=n-1) break; if(p.col+1n)&(mazep.rowp.col+1=0) visit(p.row,p.col+1,maze); if(p.row+1=0)&(mazep.rowp.col-1=0) visit(p.row,p.col-1,maze); if(p.row-1=0)&(mazep.row-1p.col=0) visit(p.row-1,p.col,maze); if(p.row=m-1&p.col=n-1) printf(n=n); printf(迷宫路径为:n); printf(%d,%d)n,p.row,p.c

17、ol); mazep.rowp.col=3; while(p.predecessor!=-1) p=queuep.predecessor; printf(%d,%d)n,p.row,p.col); mazep.rowp.col=3; else printf(n=n); printf(此迷宫无解!nn);X=0; return 0;void main()int i,m,n,cycle=0;while(cycle!=(-1) printf(*n); printf( 欢迎进入迷宫求解系统n); printf( n); printf(*n); printf( 手动生成迷宫 请按:1n); printf

18、( 自动生成迷宫 请按:2n); printf( 退出 请按:3nn); printf(*n); printf(n); printf(请选择你的操作:n); scanf(%d,&i); switch(i) case 1:printf(n请输入行数:);scanf(%d,&m); printf(n); printf(请输入列数:);scanf(%d,&n); while(m39)|(n39) printf(n抱歉,你输入的行列数超出预设范围(0-39,0-39),请重新输入:nn); printf(请输入行数:);scanf(%d,&m); printf(n); printf(请输入列数:);s

19、canf(%d,&n); shoudong_maze(m,n); print_maze(m,n); mgpath(maze,m,n); if(X!=0) result_maze(m,n);printf(nnPressEnterContiue!n);getchar();while(getchar()!=n);break; case 2:printf(n请输入行数:);scanf(%d,&m); printf(n); printf(请输入列数:);scanf(%d,&n); while(m39)|(n39) printf(n抱歉,你输入的行列数超出预设范围(0-39,0-39),请重新输入:nn)

20、; printf(请输入行数:);scanf(%d,&m); printf(n); printf(请输入列数:);scanf(%d,&n); zidong_maze(m,n); print_maze(m,n); mgpath(maze,m,n); if(X!=0) result_maze(m,n); printf(nnPressEnterContiue!n);getchar();while(getchar()!=n);break; case 3:cycle=(-1);break; default:printf(n);printf(你的输入有误!n);printf(nPress Enter Contiue!n);getchar();while(getchar()!=n);break; 答辩与成绩考核答辩问答成绩评定项目权重成绩1、设计过程中出勤、能力、水平、态度等方面2、课设书写及作品质量程度3、答辩4、系统总成绩

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1