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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

设计报告 题目04 迷宫求解Word文件下载.docx

1、2. 第一行的数据为迷宫的行数m和列数n;从第2行到第m+1为迷宫值,同一行两个数字之间用空格表示。3. 实现一个以链表作存储结构的栈类型。4. 编写一个求解迷宫的非递归程序。5. 迷宫的入口位置和出口位置可由用户自己设定6. 本程序只求出一条成功的通路求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。7. 测试数据:迷宫的测试数据如下:左上角(1,1)为入口,右下角(9,8)为出口18程序执行的命令为:1)创建迷宫;2)求解迷宫;3)输出迷宫的解。2.2 过程论述程序运行后,主界面会显示主菜单,然后选择1创建迷宫,然后会提示输入行数和

2、列数,接下来便可以任意创建迷宫,其中用1表示障碍0表示通路,创建完迷宫后自己任意输入出口和入口的坐标系统便会显示每一步的方向和最终的路线。至此便完成了迷宫的创建和走出迷宫的过程。三、程序及功能说明3.1 三个模块1) 主程序模块:void main() 初始化; do 接受命令; 处理命令; while(命令!=”退出”);2) 栈模块-实现栈的抽象数据类型3)迷宫模块-实现迷宫抽象数据类型各个模块之间的调用关系如下: 主程序模块-迷宫模块-栈模块3.2各功能函数3.2.1位坐标置类型typedef struct position /定义坐标 int x; /当前横坐标 int y; /当前纵

3、坐标position;3.2.2迷宫类型1.初始化迷宫void InitMaze(int MazeNN,int m,int n) /初始化迷宫 int i,j;print(2); printf(请输入迷宫: |n); /按照用户要求输入一二维数组来表示迷宫 print(4); for(i=0;im;i+) print(2); for(j=0;jn;j+) scanf(%d,&Mazeij); if(Mazeij != 0 & Mazeij != 1) i=-1; break; if(i=-1) break; if(i=-1) print(1);printf(请输入0或1 ! fflush(st

4、din); /清空缓存 InitMaze( Maze, m, n); else print(1);2.标记此处不通int markThree(position curpos,int mazeNN) /标记此处不通 mazecurpos.xcurpos.y=3; return 1; 3.检查当前通道块是否可通int judgePass(position seat,int mazeNN,int x,int y) /检查当前通道块是否可通 if(mazeseat.xseat.y=0 & seat.x=0 & seat.y=0)/若当前坐标的值为0且坐标位置合法 return 1; return 0;

5、4.标记此处可通int markTwo(position curpos,int mazeNN) mazecurpos.xcurpos.y=2;5.转换至下一个位置void NextPos(position *curpos,int i) /转换至下一个位置 if(i=1) curpos-y+; else if(i=2)x+; else if(i=3)y-; else if(i=4)x-;6.输出迷宫void PrintMaze(int mazeNN,int m,int n)/输出迷宫 printf(%d ,mazeij); print(3); for(;j0;j-)bb printf(|n7.输

6、出迷宫void PrintMaze2(int mazeNN,int m,int n,LinkStack* stack)/输出迷宫 Node *p; p=stack-pData; while(p-next!=NULL) p=p-next; if(i=stack-pData-ele.seat.x&j=stack-ele.seat.y)|(i=p-j=p-ele.seat.y) printf(%c ,20); else if(mazeij=0),1); if(mazeij=1) ,2); if(mazeij=2) p=stack- while(p-=NULL&(p-ele.seat.x!=i|p-e

7、le.seat.y!=j) p=p- if(p-ele.direction=1) printf(,26);ele.direction=2),25);ele.direction=3),27);ele.direction=4),24); if(mazeij=3),4); 8.求解迷宫的一条路径int MazePath(int mazeNN,position start,position end,LinkStack* stack,int n1,int n2)/求解迷宫maze中,从入口Start到出口end的一条路径 DataType e; int curstep; position *curpos

8、; curpos = (position *)malloc(sizeof(position); initStack(stack); /初始化stack curpos-x = start.x;y = start.y; curstep=1; /探索第一步 if(judgePass(*curpos,maze,n1,n2) = 0)起始位置不可通过! markThree(*curpos,maze); return 0; if(judgePass(*curpos,maze,n1,n2) = 1)/当前位置可通 markTwo(*curpos,maze); /标记该点可通过 e.number = curs

9、tep; e.seat.x = curpos-x; e.seat.y = curpos-y; e.direction = 1; Push(stack,e); /加入路径,入栈 if(curpos-x = end.x &y = end.y) /到达出口位置 return 1; NextPos(curpos,1); /探索下一步 curstep+; else /若当前位置不能通过 if(IsEmpty(stack) e = Pop(stack); while(e.direction = 4) markThree(e.seat,maze);/留下不能通过的标记,并退回一步 e = Pop(stack

10、); if(e.directiony=e.seat.y; while(IsEmpty(stack);四、结果分析4.1 进入演示程序后,显示用户界面为:4.2 选择1创建迷宫后界面显示:4.3 输入迷宫后显示4.7 显示每一步的坐标和方向五、总 结此次课程设计极大地提高了我们的实际操作能力,同时也让我们对算法的意义有了更深刻的理解,一个好的算法能够极大地提高程序的工作效率,同时也能够更快更好地达到预期目的。在程序中,我们运用了链栈和深度优先搜索的知识,这也帮助我们对数据结构的知识进行了复习。本程序的核心算法是求解迷宫路径的算法,在调试的过程总,通过对该算法的完善,我们也学到了很多,特别是对漏洞

11、的查找和修补,这是整个工作中最难的部分,需要细致的调试和耐心的纠错。由于使用了链栈,对我们对指针的运用能力也造成了极大的考验。为了使程序尽量简洁,我们参照课本上的链栈模块进行修改,同时为了减少程序的运算次数,我们尽量的是程序可视化界面简洁化,减少花哨的成分。本程序借鉴了一个C+程序的一些思想,在借鉴的过程中,我们也了解到一些C+与C这两种语言的区别,比如C语言与C+相比,结构体不能直接互相赋值,元素的定义必须写在赋值、判断、循环语句之前等。虽然过程并不轻松,但在我们的团结协作下,我们完成了这次课程设计,我们不只学到了,也培养了合作意识,这也是一大收获!通过这次课程设计,我在多方面有所提高。1、

12、编译工具VisualC+很多程序在结构上是独立的,但是本次设计的程序功能不是零散的,我所应用的调试工具是VisualC+,可以充分利用Windows的支持剪切板和英文的特点。2、巩固和温习了C语言在界面设置中使用函数调用while。其中文本显示颜色和背景颜色都可以任意按照自己的喜好,任意改变,同时在制作显示菜单的窗口,大 小根据菜单条数设计。最后采用 printf 输出程序设计界面。 这次的程序软件基本上运行成功,可以简单的建立链式循环链表,并进行输出,及循环语句的运用和选择语句的控制六、课程设计心得体会通过此次课程设计,使我更加扎实的掌握了有关栈方面的知识,在设计过程中虽然遇到了一些问题,但

13、经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难

14、而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。通过这次课程设计,我掌握了栈的结构特点及有关概念; 理解了顺序栈的存储结构;初步掌握了顺序栈的基本操作算法。我认为,在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践

15、,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能

16、力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。参考文献1 曲朝阳, 郭晓利, 王晓慧, 孙鸿飞. 数据结构.中国电力出版社,2007源程序#includestdlib.hwindows.hconio.h#define N 100#define OK 0 int MAX_SIZE=100; /宏定义,使程序更直观int MazeNN; /迷宫存放在一个数字型数组中typedef struct DataTyp

17、e int number; /通道块在路径上的序号 position seat; /通道块在迷宫中坐标位置 int direction; /从此通道块走向下一通道块的方向DataType; /栈数据元素的类型typedef struct Node /定义结构体变量表示顺序栈 DataType ele; /ele为结构体类型的元素 struct Node* next;Node;typedef struct LinkStack Node *pData; /指向栈的指针 int top; /记录栈的结点个数LinkStack;void print(int x) if(x=0) |n if(x=1)

18、|-|n if(x=2) | if(x=3) if(x=4) | |nvoid initStack(LinkStack* L) /链栈的初始化 L-pData = NULL;top=-1;intIsEmpty(LinkStack*L) /判断是否为空函数,0为空, 1为非空 if(!L-pData) return L-topvoid destroyStack(LinkStack* L) /链栈的销毁: 销毁之后L-ele=NULL, 而L则没有变化 Node *p,*q;/输入必须保证L是可用的链栈, 否则应做相应的判断IsEmpty(L) return; q=L- /判断栈是否存在 whil

19、e(q != NULL) p=q; q = q- free(p);/释放顺序栈占用的空间 L = NULL;/返回值表示操作成功 free(L);int countStack(LinkStack* L) /求栈中元素个数top;void Push(LinkStack* L,DataType data) /入栈操作 Node* m = (Node*)malloc(sizeof(Node); /通过malloc函数分配空间 if(NULL=m)空间分配失败 ! m-ele.number = data.number; /将data中的数据复制 ele.seat.x = data.seat.x;ele

20、.seat.y = data.seat.y;ele.direction =data.direction;next = NULL; if (NULL=L-pData) /如果刚开始栈为空执行以下语句 L-pData = m;top+; else m-next = L- /注意此处如果栈为空,L-top自加两次DataTypePop(LinkStack*L) /出栈操作函数 DataType m; /定义结构体类型的指针m /定义结构体类型的指针p桟是空的 ! m.number = L-ele.number; m.seat.x = L-ele.seat.x; m.seat.y = L-ele.seat.y; m.direction=L-ele.direction; p = L-pData = L- free(p); /释放p所指的空间top-; return m;Node* StackTraverse(Node *pData) /用递归输出栈中的每个元素 if(pData-next = NULL),pData-ele.number,pData-ele.seat.x+1,pData-ele.seat.y+1,pData-ele.d

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

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