迷宫求解-数据结构实训报告-附源代码--迷宫与栈-小老鼠吃奶酪穷举求解(共21页).doc
《迷宫求解-数据结构实训报告-附源代码--迷宫与栈-小老鼠吃奶酪穷举求解(共21页).doc》由会员分享,可在线阅读,更多相关《迷宫求解-数据结构实训报告-附源代码--迷宫与栈-小老鼠吃奶酪穷举求解(共21页).doc(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上数据结构实训报告 设 计 题 目: 迷宫的求解(B) 系 别: XXXXXXXXXX 专 业 (方 向): XXXXXXXX 年 级、 班: XXXXXXXXXXXX 学 生 姓 名: XXX 学 生 学 号: XXXXXX 指 导 教 师: XXX 日 期: XXXX年XX月XX号 专心-专注-专业目录、3、7、8、100(一)测试迷宫与栈问题可通的程序设计.10、11 (二)测试迷宫与栈问题不可通的程序设计.12六、 总结.12、134、19迷宫的求解一、系统开发的背景迷宫求解其实就是迷宫与栈的问题,训练老鼠在迷宫中寻找食物。于是,老鼠过迷宫问题就此产生,这是一个
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),(
6、3,2,3),(3,1,2),。(2) 编写递归形式的算法,求得迷宫中所有可能的通路。(3) 以方阵形式输出迷宫及其通路。(一)系统模块结构设计通过对系统功能的分析,迷宫与栈问题的功能如图1所示。主函数输出迷宫求解所有路径初始化迷宫 判断栈是否为空出栈入栈初始化栈判断能否通过,是否踩雷留下标记判断方向留下足迹图1: 迷宫实现的主函数功能图通过上图的功能分析,把整个系统划分为2个模块:1、 通过栈后进先出的结构,实现栈判断,首先判断栈是否为空,如果不为空,则实现栈中基本的入栈,出栈的实现。顺序栈是用一组地址连续的 内存单元依次保存栈中的运算规则,在链式存储中链表首部head指针所指向元素为栈顶元
7、素,栈表尾部指向地址为NULL为栈底。2、 借助函数的嵌套与使用,由while语句对整体进行控制,return语句控制跳出函数,判断在迷宫中是否有出路,如果有出路,则通过东,西,南,北的方向进行路径的输出;如果无出路,则说明此迷宫不能走出。四、 系统的设计与实现(一) 在栈中实现迷宫的基本操作分析:首先输出表头,然后依次输入想要实现的步骤。功能图如图2所示。入口,出口位置传人方法里循环不结束,无解迷宫判断当前是否通过将元素入栈上边是否存在通路下边是否存在通路右边是否存在通路左边是否存在通路是否到达迷宫出口存在结点入栈有解迷宫图2:迷宫的实现功能图该模块的具体代码如下所示。void Maze:l
8、ujing() 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; /开始为-1Push(S1, elem);again:while (!StackEmpty(S1) /栈不为空 有路径可走Pop(S1, elem);i = elem.x;j = elem.y;d = elem.d + 1; /
9、下一个方向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);Push(S1, e);cout e.x , e.y ,
10、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;while (S1) /逆置序列 并输出迷宫路径序列Pop(S1, e);Push(
11、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 抱歉,小老鼠走投无路没有吃到奶酪! elem = e; /将元素值置入结点数据域p-next = S; /原栈顶结点昨晚新结点后继S = p; /将新结点置为栈顶retu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 迷宫 求解 数据结构 报告 源代码 老鼠 奶酪 穷举 21
限制150内