迷宫问题非递归求解-数据结构c语言课程设计

上传人:桔**** 文档编号:433258759 上传时间:2023-01-20 格式:DOC 页数:20 大小:101.01KB
返回 下载 相关 举报
迷宫问题非递归求解-数据结构c语言课程设计_第1页
第1页 / 共20页
迷宫问题非递归求解-数据结构c语言课程设计_第2页
第2页 / 共20页
迷宫问题非递归求解-数据结构c语言课程设计_第3页
第3页 / 共20页
迷宫问题非递归求解-数据结构c语言课程设计_第4页
第4页 / 共20页
迷宫问题非递归求解-数据结构c语言课程设计_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《迷宫问题非递归求解-数据结构c语言课程设计》由会员分享,可在线阅读,更多相关《迷宫问题非递归求解-数据结构c语言课程设计(20页珍藏版)》请在金锄头文库上搜索。

1、 数据结构课程设计报告 题目:迷宫问题非递归求解 2010年 6月 4日目录 一. 实验内容.3二. 需求分析3三总体设计4四详细设计6五代 码10六. 测 试.15七. 总 结.17一. 实验内容任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;要求:二.需求分析1.可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;要求:使用非递归算法。2.用户可以根据自己的需求进行输入所需的迷宫,其中1表示迷宫的墙壁,0表示迷宫的通路,从而建立自己的迷宫;3.用户还可以自己设计迷宫的入口坐标,当然也可以设计出口了;4.程序执行的命令

2、包括:(1)构造栈Stack, T 描述迷宫中当前位置的结构类型, LinkNode链表结点三个类,其中Stack是Linknode的友元类. (2)构造存取迷宫的二维指针GetMaze(int &m,int &n) (3)恢复迷宫Restore(int *maze,int m,int n) (4)在迷宫中寻找一条通路Mazepath(int *maze,int m,int n) (5)输出所找到的通路PrintPath() (6) 定义当前位置移动的4个方向move数组.三总体设计存储结构:首先用二维指针存储迷宫数据,迷宫数据由用户输入。一个以链表作存储结构的栈类型,然后编写一个求解迷宫的递

3、归或非递归程序。求得的通路以三元组(i,j,d)形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向(东、南、西、北四个方向所用代表数字,自行定义)。1从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。迷宫的入口点的下标为(1,1),出口点的下标为(m,n)。为处理方便起见,可在迷宫的四周加一圈障碍。对于迷宫的任一位置,均可约定有东、南、西、北四个方向可通。经过的位置把0变为-1,带输出迷宫路径后在恢复迷宫院士为止2. 本程序有三个模

4、块: 主程序模块 三个类模块即其对象:实现栈链表抽象数据类型; 迷宫二维指针单元模块:存储迷宫,寻路径,输出迷宫,恢复迷宫。(二)流程图存取迷宫GetMaze(int &m,int &n)求取一条路径MazePath()if(p.GetPop().x=q.GetPop().x&p.GetPop().y=q.GetPop().y)输入迷宫的长和宽内容显示结果Printpath()迷宫无路经 END数组move用于更改方向,函数Push, PrintPath, Restore调用函数GetPop, Push,Pop恢复迷宫Restore()调用四详细设计(一).基本算法:首先用二维指针存储迷宫数据

5、,迷宫数据由用户输入。一个以链表作存储结构的栈类型,然后编写一个求解迷宫的递归或非递归程序。求得的通路以三元组(i,j,d)形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向(东、南、西、北四个方向所用代表数字,自行定义)。迷宫的过程可以模拟为一个搜索的过程:每到一处,总让它按东、南、西、北4个方向顺序试探下一个位置;如果某方向可以通过,并且不曾到达,则前进一步,在新位置上继续进行搜索;如果4方向都走不通或曾经到达过,则退回一步,在原来的位置上继续试探下一位置。每前进或后退一步,都要进行判断:若前进到了出口处,则说明找到了一条通路;若退回到了入口处,则说明不存在通路。用一

6、个二维指针数组迷宫表示迷宫,数组中每个元素取值“0”(表示通路)或“1”(表示墙壁)。迷宫的入口点在位置(1,1)处,出口点在位置(m,n)处。设计一个模拟走迷宫的算法,为其寻找一条从入口点到出口点的通路。二维数组的第0行、第m+1行、第0列、第m+1列元素全置成“1”, 表示迷宫的外墙;第1行第1列元素和第m行第m列元素置成“0”, 表示迷宫的入口和出口;其余元素值用GetMaze函数获取.假设当前所在位置是(x,y)。沿某个方向前进一步,它可能到达的位置最多有4。如果用二维数组move记录4方向上行下标增量和列下标增量,则沿第i个方向前进一步,可能到达的新位置坐标可利用move数组确定:

7、x=x+moveloop0 y=y+moveloop1从迷宫的入口位置开始,沿图示方向顺序依次进行搜索。定义一个栈,按从入口到出口存取路径.在搜索过程中,每前进一步,如果有新位置入栈,则把上一个探索的位置存入栈中,当前位置”-1”(表示这个位置在通路上),并将该位置的坐标压入栈中。如果没有新位置入栈,则返回到上一个位置.到达出口后,最后一个位置入栈,输出路径,并回复路径.把-1变为0.总之,入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。迷宫的入口点的下

8、标为(1,1),出口点的下标为(m,n)。为处理方便起见,可在迷宫的四周加一圈障碍。对于迷宫的任一位置,均可约定有东、南、西、北四个方向可通。(二). 为实现算法,需要类的象数据类型:类及其对象:类 Stack 对象成员如下:Stack(); 构造函数,置空栈操作结果:构造一个空的栈S。Stack(); 析构函数 void Push(T e); 把元素data压入栈中T Pop(); 使栈顶元素出栈 T GetPop(); 取出栈顶元素 void Clear(); 把栈清空 bool empty(); 判断栈是否为空,如果为空则返回1,否则返回0T类 迷宫中当前位置的结构类型: T对象成员如下

9、:x; x代表当前位置的行坐标y; y代表当前位置的列坐标dir; 0:无效,1:东,2:南,3:西,4:北LinkNode类 链表结点: 对象成员如下:友元类 StackT dataLinkNode *next(三).函数调用关系main GetMaze Mazepath Empy() GetPop() Push() PrintPath() Restore() Pop() GetPop() Push()(四) 算法的时间、空间复杂度1)本算法在空间上主要开辟了一个二维指针,规模都是迷宫(m+2)*(n+2),一个是栈,一个是迷宫路径记录,输出时候调用栈,在恢复迷宫。2)在时间上为简单的链表栈

10、的存储结构,二维指针GetMaze, Restore两函数算法时间复杂度为O((m+2)*(n+2)), Mazepath,PrintPath为O(1),(m为行数,n为列数)。(五) UML图T+X:int+y:int+dir:int LinkNode+T dataStack+push(T e):void+T Getpop ( ):void+T pop ( )+empty ( ):bool+Stack ( )+Stack ( )+Clear ( ):void+nextLinkNodeLinkNode-top五代码/*以一个mn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,

11、对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如:对于下列数据的迷宫,输出的一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),。*/#includeusing namespace std;class T /定义描述迷宫中当前位置的结构类型public: int x; /x代表当前位置的行坐标 int y; /y代表当前位置的列坐标 int dir; /

12、0:无效,1:东,2:南,3:西,4:北;class LinkNode /链表结点 friend class Stack;public: T data; LinkNode *next;class Stackprivate: LinkNode *top; /指向第一个结点的栈顶指针public: Stack(); /构造函数,置空栈 Stack(); /析构函数 void Push(T e); /把元素data压入栈中 T Pop(); /使栈顶元素出栈 T GetPop(); /取出栈顶元素 void Clear(); /把栈清空 bool empty(); /判断栈是否为空,如果为空则返回1,否则返回0;Stack:Stack() /构造函数,置空栈 top=NULL;Stack

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 试题/考题 > 初中试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号