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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(迷宫求解 数据结构实训报告 附源代码迷宫与栈 小老鼠吃奶酪穷举求解.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

迷宫求解 数据结构实训报告 附源代码迷宫与栈 小老鼠吃奶酪穷举求解.docx

1、迷宫求解 数据结构实训报告 附源代码 迷宫与栈 小老鼠吃奶酪穷举求解数据结构实训报告 设 计 题 目: 迷宫的求解(B) 系 别: XXXXXXXXXX 专 业 (方 向): XXXXXXXX 年 级、 班: XXXXXXXXXXXX 学 生 姓 名: XXX 学 生 学 号: XXXXXX 指 导 教 师: XXX 日 期: XXXX年XX月XX号 (一)测试迷宫与栈问题可通的程序设计.10、11 (二)测试迷宫与栈问题不可通的程序设计.12六、 总结.12、13迷宫的求解一、系统开发的背景迷宫求解其实就是迷宫与栈的问题,训练老鼠在迷宫中寻找食物。于是,老鼠过迷宫问题就此产生,这是一个很有趣

2、的计算机问题,主要利用 “栈”是老鼠通过尝试的办法从入口穿过迷宫走到出口。迷宫只有两个门,一个叫做入口,另一个叫做出口。把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫。迷宫中设置很多隔壁,对前进方向形成了多处障碍,在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口。为了使迷宫更佳富有趣味性,按照设计要求,我还设置地雷,如果老鼠在前进的过程中踩到地雷,则要重新回到入口,继续寻找能吃到奶酪的通路。求解迷宫问题,即找出从入口到出口的路径。而数据结构则是数据的组织形式,可以用来表示特定的对象数据,在计算机中对数据的一种存储和组织形式,因此选用栈思想实现迷宫游戏的基本操作,也是我设计迷

3、宫求解的基本背景。二、系统分析与设计(一)系统分析:迷宫问题通常是用“穷举求解”方法解决,即从入口出发,顺着某个方向进行搜索,若能走通,则继续往前走;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。另外附加的老鼠踩地雷则类似于是在通路上埋藏的隐形墙,如果踩到到雷则返回起点,寻找下一条通路。栈是一个后进先出的结构,可以用来保存从入口到当前位置的路径。定义迷宫类型来存储迷宫数据,通常设定入口点的下标,出口点的下标,为处理方便起见,在迷宫的周围加一圈障碍,对于迷宫任何一个位置均约定为东、西、南、北四个方向,而东北、东

4、南、西北、西南则是需要利用到两个下标进行移动。(二)系统具体设计在某个点上,按照一定的顺序(在本程序中顺序为上、右、下、左,而东北、东南、西北、西南利用的是两个下标移动)对周围的墙、路进行判断(在本程序中分别用1、0代替),若周围某个位置为0,则移动到该点上,再进行下一次判断;若周围的位置都为1(即没有通路),则一步步原路返回并判断有无其他通路,然后再次进行相同的判断,直到走到终点为止,或者确认没有任何通路后终止程序,附加踩雷(在本程序中用5代替)则返回到起点重新寻找下一条通路,并显示踩雷路线。要实现上述算法,需要用到栈的思想。栈里面压的是走过的路径,若遇到死路,则将该位置(在栈的顶层)弹出,

5、再进行下一次判断;若遇到通路,则将该位置压栈并进行下一次判断。如此反复循环,直到程序结束。此时,若迷宫有通路,则栈中存储的是迷宫通路坐标的倒序排列,再把所有坐标顺序打印后,即可得到正确的迷宫通路,附加的踩雷则是相当于在通路上隐形了一道墙,踩雷,则从栈顶弹出,返回起点,再进行二次判断另一条通路。三、系统功能要求(1)首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非归程序。求得的通路以三元组(i,j,d)的形式输出。其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如,对于下列数据的迷宫,输出一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(

6、3,1,2),。(2)编写递归形式的算法,求得迷宫中所有可能的通路。(3)以方阵形式输出迷宫及其通路。(一)系统模块结构设计通过对系统功能的分析,迷宫与栈问题的功能如图1所示。 图1: 迷宫实现的主函数功能图通过上图的功能分析,把整个系统划分为2个模块:1、通过栈后进先出的结构,实现栈判断,首先判断栈是否为空,如果不为空,则实现栈中基本的入栈,出栈的实现。顺序栈是用一组地址连续的 内存单元依次保存栈中的运算规则,在链式存储中链表首部head指针所指向元素为栈顶元素,栈表尾部指向地址为NULL为栈底。2、借助函数的嵌套与使用,由while语句对整体进行控制,return语句控制跳出函数,判断在迷

7、宫中是否有出路,如果有出路,则通过东,西,南,北的方向进行路径的输出;如果无出路,则说明此迷宫不能走出。四、系统的设计与实现(一)在栈中实现迷宫的基本操作分析:首先输出表头,然后依次输入想要实现的步骤。功能图如图2所示。图2:迷宫的实现功能图该模块的具体代码如下所示。void Maze:lujing() int i, j, d; int a, b; lianzhan elem, e; PLStack S1, S2, S3; InitStack(S1); InitStack(S2); InitStack(S3); mazestart.xstart.y = 2; /入口点作上标记 elem.x =

8、 start.x; elem.y = start.y; elem.d = -1; /开始为-1 Push(S1, elem);again: while (!StackEmpty(S1) /栈不为空 有路径可走 Pop(S1, elem); i = elem.x; j = elem.y; d = elem.d + 1; /下一个方向 while (d4) /试探东南西北各个方向 a = i + diraddd0; b = j + diraddd1; if (mazeab = 5) while (S1) /逆置序列 并输出迷宫路径序列 Pop(S1, e); Push(S3, e); mazeab

9、 = 1; for (i = 0; i m; i+) for (j = 0; j n; j+) if (mazeab = 2) mazeab = 0; cout n0=东 1=南 2=西 3=北 4=走出迷宫nn通路为(横坐标,列坐标,方向):n; while (S3) Pop(S3, e); Push(S1, e); cout e.x , e.y , e.d ; cout n你在 a , b 点踩到地雷了 endl; d = 0; goto again; if (a = end.x & b = end.y & mazeab = 0) /如果到了出口 elem.x = i; elem.y =

10、j; elem.d = d; Push(S1, elem); elem.x = a; elem.y = b; elem.d = 4; /方向输出为-1 判断是否到了出口 Push(S1, elem); cout n0=东 1=南 2=西 3=北 4=走出迷宫nn通路为(横坐标,列坐标,方向):n; while (S1) /逆置序列 并输出迷宫路径序列 Pop(S1, e); Push(S2, e); while (S2) Pop(S2, e); cout e.x , e.y , e.d ; return; /选用return跳出两层循环 if (mazeab = 0) /找到可以前进的非出口的

11、点 mazeab = 2; /标记走过此点 elem.x = i; elem.y = j; elem.d = d; Push(S1, elem); /当前位置入栈 i = a; /下一点转化为当前点 j = b; d = -1; d+; cout 抱歉,小老鼠走投无路没有吃到奶酪! elem = e; /将元素值置入结点数据域 p-next = S; /原栈顶结点昨晚新结点后继 S = p; /将新结点置为栈顶 return 1;int Maze:Pop(PLStack &S, lianzhan &e) /栈顶元素出栈 PLStack p; if (!StackEmpty(S) e = S-e

12、lem; p = S; S = S-next; delete p; /释放结点 return 1; else return 0;(三)整个系统的生成流程图N Y Y N Y Y N Y N N Y 五、程序测试与步骤(一)测试迷宫与栈问题的可通程序设计测试该函数使用的测试方法,测试的具体步骤,测试用例的选取,测试的结果。图4: 在测试中可以找到迷宫和踩雷路径(二)测试迷宫与栈问题的不可通程序设计测试该函数使用的测试方法,测试的具体步骤,测试用例的选取,测试的结果。图5: 在测试中并未找到迷宫路径六、总结迷宫求解首先实现了随机输入m和n的值,自己设定一个矩阵的行与列,在给定空间内控制了迷宫的范围

13、,再从电脑中输入“0”为通路,“1”为围墙显示出一个迷宫的雏形来,最终通过for循环给写好的迷宫加一个围墙,得到我们想要的结果,并且给定迷宫的入口和出口,从而寻找到迷宫的可同路径或者说入口处进入后,并不能找到可通路径从而退出。而我定义“5”为地雷,这样小老鼠就能愉快的踩雷回到起点了,重新进行下一步的通路探测。也可以循环使用此程序。系统在设计过程中我只考虑到了迷宫中给定入口和出口,在选择路径时仅有东、西、南、北,这四个方向寻找出口,而不是更加全面的在东南、东北、西南、西北,方向同时寻找迷宫的出路,因此这一点是我认为考虑很不周到的,但是我已经对这个功能有了初步设想,利用移动两次下标进行东南、东北、

14、西南、西北的方向实现,希望能够在今后的学习中更好的完善,让这个迷宫求解更加的充实。我的收获是这次的课程设计的内容是使用C+和数据结构来实现栈的应用,这对我来说是个很具有挑战性的任务,虽然只做了一个迷宫与栈的问题,而且运行起来有很大的局限性,但通过两星期的设计也从中学到了不少的东西,更多的了解到了课本中丰富的内容。数据结构是一门实践性较强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。同时再次深刻的了解了数据结构中数组与基本函数之间的调用,并且使用顺序结构,选择结构,循环结构的嵌套,根据实际问题的需要实现迷宫与栈问题。在本次课程设计中,我明白了理论与实际相结合的重要性,并提高了

15、自己组织数据及编写程序的能力,挺高了综合运用所学知识的能力。七、附件(代码、部分图表)#includeusing namespace std;#define M 20 /行#define N 20 /列int m, n;int diradd42 = 0, 1 , 1, 0 , 0, -1 , -1, 0 ; /行增量和列增量 方向依次为东西南北struct Zuobiao /定义迷宫内点的坐标类型 int x; int y;struct lianzhan /链栈元素 int x, y; /x行,y列 int d; /d为下一步的方向;typedef struct LStack /链栈 lian

16、zhan elem; struct LStack *next;*PLStack;/*栈函数*/class Mazepublic: Maze(); Maze(); int InitStack(PLStack &S); /构造空栈 int StackEmpty(PLStack S); /判断栈是否为空 int Push(PLStack &S, lianzhan e); /在栈中放入一个新的数据元素(进栈) int Pop(PLStack &S, lianzhan &e); /栈顶元素出栈 /*求迷宫路径函数*/ void lujing(); void initmaze(); void input(

17、);private: int mazeMN; struct Zuobiao start, end; /start,end入口和出口的坐标 ;int main() int s; Maze example; cout * endl; cout *小老鼠吃奶酪* endl; cout * endl; cout * endl; cout * endl; example.initmaze();/建立迷宫 example.input();/输入 example.lujing();/路径 cout endl; cout endl; cout endl; cout * endl; cout ; cin s;

18、if (s = 1) main(); else cout #GAME OVER!#n谢谢进入迷宫游戏! elem = e; /将元素值置入结点数据域 p-next = S; /原栈顶结点昨晚新结点后继 S = p; /将新结点置为栈顶 return 1;int Maze:Pop(PLStack &S, lianzhan &e) /栈顶元素出栈 PLStack p; if (!StackEmpty(S) e = S-elem; p = S; S = S-next; delete p; /释放结点 return 1; else return 0;/*求迷宫路径函数*/void Maze:lujin

19、g() int i, j, d; int a, b; lianzhan elem, e; PLStack S1, S2, S3; InitStack(S1); InitStack(S2); InitStack(S3); mazestart.xstart.y = 2; /入口点作上标记 elem.x = start.x; elem.y = start.y; elem.d = -1; /开始为-1 Push(S1, elem);again: while (!StackEmpty(S1) /栈不为空 有路径可走 Pop(S1, elem); i = elem.x; j = elem.y; d = e

20、lem.d + 1; /下一个方向 while (d4) /试探东南西北各个方向 a = i + diraddd0; b = j + diraddd1; if (mazeab = 5) while (S1) /逆置序列 并输出迷宫路径序列 Pop(S1, e); Push(S3, e); mazeab = 1; for (i = 0; i m; i+) for (j = 0; j n; j+) if (mazeab = 2) mazeab = 0; cout n0=东 1=南 2=西 3=北 4=走出迷宫nn通路为(横坐标,列坐标,方向):n; while (S3) Pop(S3, e); P

21、ush(S1, e); cout e.x , e.y , e.d ; cout n你在 a , b 点踩到地雷了 endl; d = 0; goto again; if (a = end.x & b = end.y & mazeab = 0) /如果到了出口 elem.x = i; elem.y = j; elem.d = d; Push(S1, elem); elem.x = a; elem.y = b; elem.d = 4; /方向输出为-1 判断是否到了出口 Push(S1, elem); cout n0=东 1=南 2=西 3=北 4=走出迷宫nn通路为(横坐标,列坐标,方向):n;

22、 while (S1) /逆置序列 并输出迷宫路径序列 Pop(S1, e); Push(S2, e); while (S2) Pop(S2, e); cout e.x , e.y , e.d ; return; /选用return跳出两层循环 if (mazeab = 0) /找到可以前进的非出口的点 mazeab = 2; /标记走过此点 elem.x = i; elem.y = j; elem.d = d; Push(S1, elem); /当前位置入栈 i = a; /下一点转化为当前点 j = b; d = -1; d+; cout 抱歉,小老鼠走投无路没有吃到奶酪! endl;/*建立迷宫*/void Maze:initmaze() int i, j; /迷宫行,列 cout m; cout n; cout *

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

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