版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、严选内容# 目目 录录 摘摘 要要.1 前前 言言.2 正正 文文.3 1.采用类C语言定义相关的数据类型.3 2.各模块的伪码算法.3 3.搜索算法流程图.6 4.调试分析.7 5.测试结果.7 6.源程序(带注释).10 总总 结结.16 参考文献参考文献.17 致致 谢谢.18 附件附件 部分源程序代码部分源程序代码.19 严选内容# 摘摘 要要 在现实生活中,会遇到很多很多关于迷宫这样很复杂、很难解决 的问题的问题。如果人工去解决这些问题,会很麻烦,花很长的时间, 甚至无法解决。假如用计算机去解决,可以通过手动生成迷宫,也可 以通过计算机随机的产生迷宫,最终退出。而且可以很快的求解迷宫
2、, 找到从入口到出口的通路,或者当没有通路时,得出没有通路的结论。 找出通路之后,会显示出通路路经,而且以图示的方式显示出通路, 这样会使人一目了然的看清此迷宫的通路。迷宫是一个矩形区域,可 以使用二维数组表示迷宫,这样迷宫的每一个位置都可以用其行列号 来唯一指定,但是二维数组不能动态定义其大小,我们可以考虑先定 义一个较大的二维数组 mazeM+2N+2,然后用它的前 m 行 n 列来存 放元素,即可得到一个 mn 的二维数组,这样(0,0)表示迷宫入口位 置,(m-1,n-1)表示迷宫出口位置。 关键词关键词: 迷宫;通路;二维数组;路径 严选内容# 前前 言言 随着社会经济的发展,信息化
3、程度的不断深入,传统的人工求解迷 宫问题已不能满足生活的需要。近几年,随着迷宫问题越来越复杂、 科技也越来越发达,人们逐渐的开始用计算机求解迷宫问题。迷宫问 题很复杂,但是人们又不得不去研究这个问题,因为人们的生活中需 要它,离不开它。在迷宫路径的搜索过程中,首先从迷宫的入口开始, 如果该位置就是迷宫出口,则已经找到了一条路径,搜索工作结束。 否则搜索其上、下、左、右位置是否是障碍,若不是障碍,就移动到 该位置,然后再从该位置开始搜索通往出口的路径;若是障碍就选择 另一个相邻的位置,并从它开始搜索路径。为防止搜索重复出现,则 将已搜索过的位置标记为 2,同时保留搜索痕迹,在考虑进入下一个 位置
4、搜索之前,将当前位置保存在一个队列中,如果所有相邻的非障 碍位置均被搜索过,且未找到通往出口的路径,则表明不存在从入口 到出口的路径。这实现的是广度优先遍历的算法,如果找到路径,则 为最短路径。 严选内容# 严选内容# 正正 文文 1.1. 采用类采用类 c c 语言定义相关的数据类型语言定义相关的数据类型 节点类型和指针类型 迷宫矩阵类型:int mazeM+2N+2;为方便操作使其为全局变量 迷宫中节点类型及队列类型:struct pointint row,col,predecessor que512 2.2. 各模块的伪码算法各模块的伪码算法 1、迷宫的操作 (1)手动生成迷宫 void
5、 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()%2 /由于 rand()产生的随机数是从 0 到 RAND_MAX,RAND_MAX 是定义在 stdlib.h 中的,其值至少为 32767),要产生 从 X 到 Y 的数,只需要这样写:k=rand()%(Y-X+1)+X; (3)打印迷宫图形 void print_maze(int
6、 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 dequeue(struct point p) head+,返回 quehead-1 判断队列是否为空 int is_empty() 返回 head=tail 的值,当队列为空时,返回 0 访问迷宫矩阵中节点 void
7、 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,从 maze00开 始访问。如果入口处即为障碍,则此迷宫无解,返回 0 ,程序结 束。否则访问入口节点,将入口节点标记为访问过 mazep.row p.col=2,调用函数 en
8、queue(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=0,说明未到迷宫左 边界,且其左方有通路,则 visit(p.row,p.col-1,maze),将左 方节点入队
9、标记已访问 如果 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; 最后将路径图形打印出来。 2.菜单选择 while(cycle!=(-1) 手动生成迷宫 请按:1 自动生成迷宫 请按:2 退出 请按
10、:3 scanf(%d, 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); break; 3.3. 搜索算法流程图搜索
11、算法流程图 严选内容# 4.4. 调试分析调试分析 a、调试中遇到的问题及对问题的解决方法 在调试过程中,刚开始系统自动生成的迷宫并不是随机的,而是每次生成 的都一样;求解时,不能正确的得到结果,有时还会求错;输出的路径是乱的, 而不是按顺序显示。 出现上述问题之后,经过和同学的探讨研究,重写随机函数、修改语句、 调换语句的位置等一次一次的试验,最终问题才得以解决。 在调试过程中,首先使用的是栈进行存储,但是产生的路径是多条或不是 最短路径,所以通过算法比较,改用此算法 b、算法的时间复杂度和空间复杂度 该算法的运行时间和使用系统栈所占有的存储空间与迷宫的大小成正比, 迷宫长为 m,宽为 n,
12、在最好情况下的时间和空间复杂度均为 O(m+n) ,在最差情 况下均为 O(m*n) ,平均情况在它们之间 5.5. 测试结果测试结果 进入系统主菜单: 严选内容# 选择 1,即手动生成迷宫,及生成后有通路的求解结果: 选择 2,系统自动生成迷宫,此迷宫无通路: 严选内容# 选择 2,系统自动生成迷宫,生成的有解迷宫的解: 严选内容# 选择 3,退出系统: 6.6. 源程序(带注释)源程序(带注释) #includestdlib.h #includestdio.h 严选内容# #define N 39 #define M 39 int X; int mazeN+2M+2; struct poi
13、nt int 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, 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
14、+) mazeij=rand()%2; /自动生成迷宫的随机函数 /由于 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
15、) printf(); if(mazeij=1) printf(); printf(迷宫出口n); void result_maze(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 dequ
16、eue() 严选内容# head+; return queuehead-1; int is_empty() return head=tail; void 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(此迷宫无
17、解nn);X=0;return 0; mazep.rowp.col=2; enqueue(p); while(!is_empty() p=dequeue(); if(p.row=m-1) if(p.col+1n) if(p.row+1=0) if(p.row-1=0) if(p.row=m-1 printf(迷宫路径为:n); printf(%d,%d)n,p.row,p.col); mazep.rowp.col=3; while(p.predecessor!=-1) p=queuep.predecessor; printf(%d,%d)n,p.row,p.col); mazep.rowp.c
18、ol=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( 设计者:兰理工计 算机 4 班赵永刚 n); printf(* *n); 严选内容# printf( 手动生成迷宫 请按:1n); printf( 自动生成迷宫 请按:2n); printf( 退出 请按:3nn); printf(* *n); printf(n); printf(请选择你的
19、操作:n); scanf(%d, switch(i) case 1:printf(n 请输入行数:);scanf(%d, printf(n); printf(请输入列数:);scanf(%d, while(m39)|(n39) printf(n 抱歉,你输入的行列数超出预设范围(0-39,0-39),请重 新输入:nn); printf(请输入行数:);scanf(%d, printf(n); printf(请输入列数:);scanf(%d, shoudong_maze(m,n); print_maze(m,n); mgpath(maze,m,n); if(X!=0) result_maze(
20、m,n); printf(nnPress Enter Contiue!n);getchar();while(getchar()!=n);break; case 2:printf(n 请输入行数:);scanf(%d, printf(n); 严选内容# printf(请输入列数:);scanf(%d, while(m39)|(n39) printf(n 抱歉,你输入的行列数超出预设范围(0-39,0-39),请重 新输入:nn); printf(请输入行数:);scanf(%d, printf(n); printf(请输入列数:);scanf(%d, zidong_maze(m,n); prin
21、t_maze(m,n); mgpath(maze,m,n); if(X!=0) result_maze(m,n); printf(nnPress Enter Contiue!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; 严选内容# 总总 结结 通过这段时间的课程设计,本人对计算机的应用,数据结构的作用以及
22、C 语 言的使用都有了更深的了解。尤其是 C 语言的进步让我深刻的感受到任何所学的 知识都需要实践,没有实践就无法真正理解这些知识以及掌握它们,使其成为自 己的财富。在理论学习和上机实践的各个环节中,通过自主学习和请教老师,我 收获了不少。当然也遇到不少的问题,也正是因为这些问题引发的思考给我带了 收获。从当初不喜欢上机写程序到现在能主动写程序,从当初拿着程序不只如何 下手到现在知道如何分析问题,如何用专业知识解决实际问题的转变,我发现无 论是专业知识还是动手能力,自己都有很大程度的提高。在这段时间里,我对 for、while 等的循环函数用法更加熟悉,逐渐形成了较好的编程习惯。在老师的 指导
23、帮助下,同学们课余时间的讨论中,这些问题都一一得到了解决。在程序的 调试能力上,无形中得到了许多的提高。例如:头文件的使用,变量和数组的范 围问题,定义变量时出现的问题等等。 在实际的上机操作过程中,不仅是让我们了解数据结构的理论知识,更重要 的是培养解决实际问题的能力,所以相信通过此次实习可以提高我们分析设计能 力和编程能力,为后续课程的学习及实践打下良好的基础。 在这次短短的课程实践里,我们得到了卢鹏丽老师的关心和帮助。她给了我 们很多的信息,与我们一起探讨问题,询问我们遇到了哪些问题并耐心给予指导。 当我们遇到技术上难以解决的问题时,她就会指导我们解决问题,她把自己多年 来积累的经验教授
24、给我们,使我们顺利地完成了课程实践任务。时间过得真快, 大学生活不知不觉就走过了一年,一年的大学学习和课程实践阶段的提高,使我 们本身知识得到提高的同时,也增强了我们对未来工作的信心,我们相信自己未 来的学习更使我们有能力胜任将来的工作。 严选内容# 参考文献参考文献 1 严蔚敏,吴伟民.数据结构(C 语言版) .清华大学出版社. 2 严蔚敏,吴伟民.数据结构题集(C 语言版) .清华大学出版 社. 3 DATA STRUCTURE WITH C+. William Ford,William Topp .清华大学出版社(影印版). 4 谭浩强.c 语言程序设计. 清华大学出版社. 5数据结构与
25、算法分析(Java 版) , A Practical Introduction to Data Structures and Algorithm Analysis Java Edition Clifford A. Shaffer , 张铭,刘晓丹译 电子工业出版社 2001 年 1 月 严选内容# 致致 谢谢 在这样的一个程序设计中,靠一个人的单打独斗是不可能完成 的。在这次设计过程中,在开始的构思、设想,源代码编写时的提示, 上机时精心的指点,有了老师和舍友以及身边同学的指导、意见和帮 助,最终才完成了这个迷宫求解问题系统的设计与实现。所以在这里 要对以上老师及同学表示感谢,非常感谢他们的帮助。而且在这次课 程设计中我学习到了很多很多。 严选内容# 附件附件 部分源程序代码部分源程序代码 void main() int i,m,n,cycle=0; while(cycle!=(-1) printf(*n); printf( 欢迎进入迷宫求解系统n); printf( 设计者:兰理工计 算机 4 班赵永刚 n); printf(* *n); printf( 手动生成迷宫 请按:1n); printf( 自动生成迷宫 请按:2n); printf( 退出 请按:3nn); printf(* *n); printf(n); printf(请选
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医院前台导诊护士个人总结
- 办事处妇联主席述职报告
- 月秘书试用期转正工作总结
- 2026年全国新高考化学易错有机合成题(含解析)
- 焊材配拌粉工岗前情绪管理考核试卷含答案
- 剑麻栽培工标准化能力考核试卷含答案
- 行李计划员复测模拟考核试卷含答案
- 纸张、书画文物修复师持续改进能力考核试卷含答案
- 虚拟电厂运营模式
- 2026年高职(税务会计)税务会计综合测试试题及答案
- 2025年水务公司笔试题及答案
- 2026江西省福利彩票发行中心及市级销售机构招聘编外人员14人备考题库及1套完整答案详解
- 初中英语语法完形填空阅读理解满分技巧大全
- 2026第二届全国红旗杯班组长大赛考试备考核心试题库500题
- 地铁泄密案例分析
- 工厂质量事故分析整改手册
- 24节气固元灸课件
- 公司厉行节约管理制度
- 水洗砂项目可行性研究报告模板及范文
- 律师上门调解协议书
- 2025版校园食堂日管控、周排查、月调度记录表
评论
0/150
提交评论