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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

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

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

2、标,当然也可以设计出口了;4.程序执行的命令包括: (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,带输出迷

4、宫路径后在恢复迷宫院士为止2. 本程序有三个模块: 主程序模块 三个类模块即其对象:实现栈链表抽象数据类型; 迷宫二维指针单元模块:存储迷宫,寻路径,输出迷宫,恢复迷宫。(二)流程图四详细设计(一).基本算法:首先用二维指针存储迷宫数据,迷宫数据由用户输入。一个以链表作存储结构的栈类型,然后编写一个求解迷宫的递归或非递归程序。求得的通路以三元组(i,j,d)形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向(东、南、西、北四个方向所用代表数字,自行定义)。迷宫的过程可以模拟为一个搜索的过程:每到一处,总让它按东、南、西、北4个方向顺序试探下一个位置;如果某方向可以通过,并

5、且不曾到达,则前进一步,在新位置上继续进行搜索;如果4方向都走不通或曾经到达过,则退回一步,在原来的位置上继续试探下一位置。每前进或后退一步,都要进行判断:若前进到了出口处,则说明找到了一条通路;若退回到了入口处,则说明不存在通路。用一个二维指针数组迷宫表示迷宫,数组中每个元素取值“0”(表示通路)或“1”(表示墙壁)。迷宫的入口点在位置(1,1)处,出口点在位置(m,n)处。设计一个模拟走迷宫的算法,为其寻找一条从入口点到出口点的通路。二维数组的第0行、第m+1行、第0列、第m+1列元素全置成“1”, 表示迷宫的外墙;第1行第1列元素和第m行第m列元素置成“0”, 表示迷宫的入口和出口;其余

6、元素值用GetMaze函数获取.假设当前所在位置是(x,y)。沿某个方向前进一步,它可能到达的位置最多有4。如果用二维数组move记录4方向上行下标增量和列下标增量,则沿第i个方向前进一步,可能到达的新位置坐标可利用move数组确定: x=x+moveloop0 y=y+moveloop1从迷宫的入口位置开始,沿图示方向顺序依次进行搜索。定义一个栈,按从入口到出口存取路径.在搜索过程中,每前进一步,如果有新位置入栈,则把上一个探索的位置存入栈中,当前位置”-1”(表示这个位置在通路上),并将该位置的坐标压入栈中。如果没有新位置入栈,则返回到上一个位置.到达出口后,最后一个位置入栈,输出路径,并

7、回复路径.把-1变为0.总之,入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。迷宫的入口点的下标为(1,1),出口点的下标为(m,n)。为处理方便起见,可在迷宫的四周加一圈障碍。对于迷宫的任一位置,均可约定有东、南、西、北四个方向可通。(二). 为实现算法,需要类的象数据类型:类及其对象:类 Stack 对象成员如下:Stack(); 构造函数,置空栈操作结果:构造一个空的栈S。Stack(); 析构函数 void Push(T e); 把元素data压

8、入栈中T Pop(); 使栈顶元素出栈 T GetPop(); 取出栈顶元素 void Clear(); 把栈清空 bool empty(); 判断栈是否为空,如果为空则返回1,否则返回0T类 迷宫中当前位置的结构类型: T对象成员如下:x; x代表当前位置的行坐标y; y代表当前位置的列坐标dir; 0:无效,1:东,2:南,3:西,4:北LinkNode类 链表结点: 对象成员如下:友元类 StackT dataLinkNode *next(三).函数调用关系main GetMaze Mazepath Empy() GetPop() Push() PrintPath() Restore()

9、 Pop() GetPop() Push()(四) 算法的时间、空间复杂度1)本算法在空间上主要开辟了一个二维指针,规模都是迷宫(m+2)*(n+2),一个是栈,一个是迷宫路径记录,输出时候调用栈,在恢复迷宫。2)在时间上为简单的链表栈的存储结构,二维指针GetMaze, Restore两函数算法时间复杂度为O((m+2)*(n+2)), Mazepath,PrintPath为O(1),(m为行数,n为列数)。(五) UML图 五代码/*以一个mn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 首先实现一个

10、以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(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; /0:无效,1:东,2:南,3:西,4:北;class LinkNode /链表结点

11、 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;S

12、tack:Stack() /析构函数void Stack:Push(T e) /把元素x压入栈中 LinkNode *P; P=new LinkNode; P-data=e; P-next=top; top=P;T Stack:Pop() /使栈顶元素出栈 T Temp; LinkNode *P; P=top; top=top-next; Temp=P-data; delete P; return Temp;T Stack:GetPop() /取出栈顶元素 return top-data;void Stack:Clear() /把栈清空 top=NULL;bool Stack:empty()

13、/判断栈是否为空,如果为空则返回1,否则返回0 if(top=NULL) return 1; else return 0;int move42=0,1,1,0,0,-1,-1,0; /定义当前位置移动的4个方向bool Mazepath(int *maze,int m,int n); /寻找迷宫maze中从(0,0)到(m,n)的路径 /到则返回true,否则返回falsevoid PrintPath(Stack p); /输出迷宫的路径void Restore(int *maze,int m,int n); /恢复迷宫int* GetMaze(int &m,int &n); /获取迷宫 /返

14、回存取迷宫的二维指针int main() int m=0,n=0; /定义迷宫的长和宽 int *maze; /定义二维指针存取迷宫 maze=GetMaze(m,n); /调用GetMaze(int &m,int &n)函数,得到迷宫 if(Mazepath(maze,m,n) /调用Mazepath(int *maze,int m,int n)函数获取路径 cout迷宫路径探索成功!n; else cout路径不存在!n; return 0;int* GetMaze(int &m,int &n)/返回存取迷宫的二维指针 int *maze; /定义二维指针存取迷宫 int i=0,j=0; coutab; /输入迷宫的长和宽 cout请输入迷宫内容:n; m=a; n=b; /m,n分别代表迷宫的行数和列数 maze=new int *

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

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