迷宫求解 数据结构实训报告 附源代码 迷宫与栈 小老鼠吃奶酪穷举求解
- 格式:doc
- 大小:139.00 KB
- 文档页数:21
数据结构实训报告 设 计 题 目: 迷宫的求解(B) 系 别: XXXXXXXXXX 专 业 (方 向): XXXXXXXX 年 级、 班: XXXXXXXXXXXX 学 生 姓 名: XXX 学 生 学 号: XXXXXX 指 导 教 师: XXX 日 期: XXXX年XX月XX号 目录 一、系统开发的背景 ................................................................................................................ 1 二、系统分析与设计 ................................................................................................................ 1 (一)系统的分析 .................................................................................................................... 1 (二)系统的具体分析设计 .................................................................................................... 2
三、系统的功能要求 .............................................................................................................................. 2、3 (一)系统模块结构设计 ........................................................................................................ 3 四、系统的设计与实现 ................................................................................................................................ 4 (一)在栈中实现迷宫的具体操作 ................................................................................. 4、7 (二)栈的生成 ................................................................................................................. 7、8 (三)整个系统的生成流程图………………………………………………………… 9、10
五、程序测试与步骤 ............................................................................................................. 10 (一)测试迷宫与栈问题可通的程序设计…………..……………………………………10、11
(二)测试迷宫与栈问题不可通的程序设计…………………………………………..…..12 六、 总结………………………………………………………………………………………….12、13
七、附件(代码、部分图表) ...................................................................................... 14、19 1
迷宫的求解 一、系统开发的背景 迷宫求解其实就是迷宫与栈的问题,训练老鼠在迷宫中寻找食物。于是,老鼠过迷宫问题就此产生,这是一个很有趣的计算机问题,主要利用 “栈”是老鼠通过尝试的办法从入口穿过迷宫走到出口。迷宫只有两个门,一个叫做入口,另一个叫做出口。把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫。迷宫中设置很多隔壁,对前进方向形成了多处障碍,在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口。为了使迷宫更佳富有趣味性,按照设计要求,我还设置地雷,如果老鼠在前进的过程中踩到地雷,则要重新回到入口,继续寻找能吃到奶酪的通路。求解迷宫问题,即找出从入口到出口的路径。而数据结构则是数据的组织形式,可以用来表示特定的对象数据,在计算机中对数据的一种存储和组织形式,因此选用栈思想实现迷宫游戏的基本操作,也是我设计迷宫求解的基本背景。
二、 系统分析与设计 (一) 系统分析: 迷宫问题通常是用“穷举求解”方法解决,即从入口出发,顺着某个方向进行搜索,若能走通,则继续往前走;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。另外附加的老鼠踩地雷则类似于是在通路上埋藏的隐形墙,如果踩到到雷则返回起点,寻找下一条 2
通路。栈是一个后进先出的结构,可以用来保存从入口到当前位置的路径。定义迷宫类型来存储迷宫数据,通常设定入口点的下标,出口点的下标,为处理方便起见,在迷宫的周围加一圈障碍,对于迷宫任何一个位置均约定为东、西、南、北四个方向,而东北、东南、西北、西南则是需要利用到两个下标进行移动。 (二) 系统具体设计 在某个点上,按照一定的顺序(在本程序中顺序为上、右、下、左,而东北、东南、西北、西南利用的是两个下标移动)对周围的墙、路进行判断(在本程序中分别用1、0代替),若周围某个位置为0,则移动到该点上,再进行下一次判断;若周围的位置都为1(即没有通路),则一步步原路返回并判断有无其他通路,然后再次进行相同的判断,直到走到终点为止,或者确认没有任何通路后终止程序,附加踩雷(在本程序中用5代替)则返回到起点重新寻找下一条通路,并显示踩雷路线。 要实现上述算法,需要用到栈的思想。栈里面压的是走过的路径,若遇到死路,则将该位置(在栈的顶层)弹出,再进行下一次判断;若遇到通路,则将该位置压栈并进行下一次判断。如此反复循环,直到程序结束。此时,若迷宫有通路,则栈中存储的是迷宫通路坐标的倒序排列,再把所有坐标顺序打印后,即可得到正确的迷宫通路,附加的踩雷则是相当于在通路上隐形了一道墙,踩雷,则从栈顶弹出,返回起点,再进行二次判断另一条通路。
三、 系统功能要求 3
(1) 首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非归程序。求得的通路以三元组(i,j,d)的形式输出。其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如,对于下列数据的迷宫,输出一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。 (2) 编写递归形式的算法,求得迷宫中所有可能的通路。 (3) 以方阵形式输出迷宫及其通路。 (一)系统模块结构设计 通过对系统功能的分析,迷宫与栈问题的功能如图1所示。
图1: 迷宫实现的主函数功能图 通过上图的功能分析,把整个系统划分为2个模块:
1、 通过栈后进先出的结构,实现栈判断,首先判断栈是否为空,如果不为空,则实现栈中基本的入栈,出栈的实现。顺序栈是用一组地址连续
主函数 初始化栈 入栈 出栈 判断栈是否为空
判断方向 留下足迹 判断能否通过,是否踩雷 初始化迷宫 求解所有路径 输出迷宫 留下标记 4
的 内存单元依次保存栈中的运算规则,在链式存储中链表首部head指针所指向元素为栈顶元素,栈表尾部指向地址为NULL为栈底。 2、 借助函数的嵌套与使用,由while语句对整体进行控制,return语句控制跳出函数,判断在迷宫中是否有出路,如果有出路,则通过东,西,南,北的方向进行路径的输出;如果无出路,则说明此迷宫不能走出。 四、 系统的设计与实现 (一) 在栈中实现迷宫的基本操作 分析:首先输出表头,然后依次输入想要实现的步骤。功能图如图2所示。
入口,出口位置传人方法里
判断当前是否通过 循环不结束,无解迷宫
将元素入栈
是否到达迷宫出口 右边是否存在通路 上边是否存在通路 下边是否存在通路 左边是否存在通路 5
图2:迷宫的实现功能图 该模块的具体代码如下所示。 void Maze::lujing() { int i, j, d; int a, b; lianzhan elem, e;
PLStack S1, S2, S3; InitStack(S1); InitStack(S2); InitStack(S3);
maze[start.x][start.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 = elem.d + 1; //下一个方向 while (d<4) //试探东南西北各个方向 { a = i + diradd[d][0]; b = j + diradd[d][1]; if (maze[a][b] == 5) {
while (S1) //逆置序列 并输出迷宫路径序列
存在结点入栈 有解迷宫