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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构课程设计C++.docx

1、数据结构课程设计C+数据结构课程设计 题目:迷宫问题的求解 姓名:安冬辉 学号:20090802310067 班级:09理科实验班 学院:信息科学技术学院 指导老师:任一凡目录一、【问题介绍(Instruction)】 3二、【实验构思(Conceive)】 3三、【实验设计(Design)】 41、设定迷宫的抽象数据类型定义 42、本程序的三个模块 53、迷宫类型 54、栈类型 55、主函数 56、迷宫构造 67、迷宫的显示转换 78、求解迷宫中的一条路径 89、迷宫的输出显示 1110.迷宫的路径显示 11四、【测试结果(Testing)】 121 迷宫存在通路 122 迷宫不存在通路 1

2、5五、【实验总结(Summarize)】 17六、【代码】 18一、【问题介绍(Instruction)】 迷宫问题最早出现在古希腊神话中。据说,半人半兽的英雄西修斯在克里特的迷宫中勇敢地杀死半人半牛的怪物,并循着绳索逃出迷宫。希腊史学家希罗多德曾探访过那里。他描述说,整个迷宫由12座带顶院落构成,所有的院落都由通道连接,形成3000个独立的“室”。后来的参观者也说,一旦进入迷宫,如果没有向导,根本无望走出。历史上,人们认为迷宫具有魔力。后来,迷宫成为游戏。在如今计算机非常普及的情况下,迷宫又以游戏程序的形式呈现在我们日常使用的电脑上。二、【实验构思(Conceive)】(本部分包括:描述实验

3、实现的基本思路,包括所用到的离散数学、程序设计、算法等相关知识) 1、迷宫求解问题,完成时的功能:能在规定的矩阵迷宫中从开始点走到规定的终点;以一个m x n的长方矩阵表示迷宫,1和0分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出从入口到出口的通路,或者没有通路的结论。 2、以二维数组mazeMN表示迷宫,其中maze0j和mazei0(0=j,i=N)为添加的一圈障碍。数组中以元素“1”表示通路,“0”表示障碍,迷宫的大小理论上可以不限制。 3、迷宫数据由程序提供,用户只需要进行选择迷宫就行。迷宫的入口和出口由程序提供。 4、若设定的迷宫存在通路,则以长方形矩阵的形式将迷宫

4、及其通路输出到标准终端上,其中“1”表示障碍,“0”表示通路,“.”表示通过的路径,“+”表示死胡同。 5、本程序只求出一条成功的通路。但是只要对函数进行小量的修改,就可以求出其他全部的路径。 6、程序执行命令为:创建迷宫求解迷宫输出迷宫。 三、【实验设计(Design)】(本部分包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系)1、设定迷宫的抽象数据类型定义ADT migong数据对象:D=ai,j|i,j,0=i=M,0=j=N数据关系:R=hang,lie hang=|ai-1,j,ai,j属于D,i=1,2,M,j=0,1,N

5、lie=|ai,j-1,ai,j属于D,i=0,1,M,j=1,2,N基本操作: gouzhaomigong(&maze,hang,lie)初始条件:为二维数组mazeij分配空间,对其中第1至第i-1行,每行自第1到第j-1列的元素进行赋值,并以值0表示障碍,值1表示通路。操作结果:构造迷宫的字符数组,以0表示通路,字符1表示障碍,并自动在迷宫四周加上一圈障碍。 qiujiemigong(&maze,hang,lie) 初始条件:迷宫中的所有坐标都已经被赋值操作结果:若迷宫中该坐标能够通过且已经通过,则标记为.,若不能够通过(死胡同),标记为+。 xianshimigong(maze,han

6、g,lie) 初始条件:迷宫已经存在 操作结果:以字符形式输出迷宫 xianshimigonglujing(maze,hang,lie) 初始条件:迷宫已经存在,已经求解 操作结果:若迷宫通路存在,以字符形式输出迷宫的求解路径,否则输出“次迷宫没有出路”。 danbuxianshi(maze,hang,lie) 初始条件:迷宫已存在 操作结果:显示迷宫求解过程的每一步结果 ADT migong2、本程序的三个模块2.1 主程序模块int main()初始化;构造迷宫;迷宫求解;迷宫输出;2.2 栈模块记录迷宫路径2.3 迷宫模块实现迷宫的抽象数据类型3、迷宫类型typedef struct m

7、igong elemtype mazeij;/迷宫矩阵的坐标值 int hang,lie; /迷宫矩阵的行数、列数migong;4、栈类型 struct step /定义一个栈 int x,y,n; /x,y表示步子坐标,n表示步数 ;5、主函数int main() 变量的定义; gouzhaomigong(&maze,hang,lie); /构造一个迷宫 xianshimigong(migong,hang,lie); /将该构造好的迷宫输出 qiujiemigong(&maze,hang,lie); /探索迷宫 xianshimigonglujing(maze,hang,lie); /输出探

8、索出来的迷宫 danbuxianshi(maze,hang,lie);/单步显示迷宫的路径6、迷宫构造void gouzhaomigong(char *mazeij,int hang,int lie) char *maze; /定义一个迷宫,空间可动态 int hang,lie,i,j; cout请输入矩阵的行列endl; couthang; coutlie; coutendl; maze=new char *hang+2; /分配连续空间给迷宫 for(i=0;ihang+2;i+) mazei=new char lie+2; cout请输入迷宫,0表示通路,1表示墙endl; for(i=

9、1;i=hang;i+) for(j=1;jmazeij; for(i=0;ihang+2;i+) mazei0=1; for(i=0;ilie+2;i+) maze0i=1; for(i=0;ilie+2;i+) mazehang+1i=1; for(i=0;ihang+2;i+) mazeilie+1=1; coutendlendl;7、迷宫的显示转换void change(char *maze,int hang,int lie) /改变以下迷宫的样子,为了单步显示清楚 for(int i=0;ihang+2;i+) for(int j=0;jlie+2;j+) switch(mazeij

10、) case 1: mazeij=#;break;case +:case 0:case .: mazeij= ;break; 8、求解迷宫中的一条路径void qiujiemigong(char *maze,int hang,int lie) int i=1,j=1,n=-1; char Q; step *Step; /定义一个存储路程的栈 Step=new step hang*lie; /事先给其分配一定的空间,hang*lie表示空间足够 if(maze11=1) cout迷宫入口堵住了,无法行走!endlendl; getch(); exit(0); else n+; mazeij=.;

11、 Stepn.x=i; Stepn.y=j; while(mazehanglie!=.) /由右、下、左、上的顺序判断是否走通 /1表示走不通,+表示已经走过但不通又回来的步子,.表示已经走过并通了的步子 if(mazeij+1!=1&mazeij+1!=.&mazeij+1!=+) mazeij+1=.; j=j+1; n+; Stepn.x=i; Stepn.y=j; cout第n步: 向右走到: (i,j)endl; else if(mazei+1j!=1&mazei+1j!=.&mazei+1j!=+) mazei+1j=.; i=i+1; n+; Stepn.x=i; Stepn.y

12、=j; cout第n步: 向下走到: (i,j)endl; else if(mazeij-1!=1&mazeij-1!=.&mazeij-1!=+) mazeij-1=.; j=j-1; n+; Stepn.x=i; Stepn.y=j; cout第n步: 向左走到: (i,j)endl; else if(mazei-1j!=1&mazei-1j!=.&mazei-1j!=+) mazei-1j=.; i=i-1; n+; Stepn.x=i; Stepn.y=j; cout第n步: 向上走到: (i,j)endl; else /若走不通则返回上一步 if(i=1&j=1) /当回到入口时,说

13、明无通路,结束循环 break; else mazeij=+; /将走不通的点置为+ n-; i=Stepn.x; /返回上一个点 j=Stepn.y; cout此路不通!返回至上一步: (i,j)endl; /输出返回信息 if(i=hang&j=lie) cout成功走到出口! 共n步; 9、迷宫的输出显示void xianshimigong(mazeij,int hang,int lie) cout*您输入的迷宫为*endl; cout行数:hang 列数:lie; cout 入口:1,1 出口:hang,lieendl; for(i=0;ihang+2;i+) for(j=0;jlie

14、+2;j+) coutmazeij ; coutendl; 10.迷宫的路径显示void xianshimigonglujing(char *maze,int hang,int lie,int i,int j) /输出所走的路程 if(i=1&j=1) &(hang!=1&lie!=1) /若回到原点则表明无出路 coutendlendl; cout*endl; cout|-此迷宫没有出路,所走路线如下图-|endl; cout*endl; else /否则有出路 coutendlendl; cout*endl; cout|-找到迷宫出路,如图所示-|endl; cout*endl; for(

15、i=0;ihang+2;i+) /输出步子 for(j=0;jlie+2;j+) coutmazeij ; coutendl; 四、【测试结果(Testing)】(本部分包括:对实验的测试结果,应具体列出每次测试所输入的数据以及输出的数据,并对测试结果进行分析总结)1 迷宫存在通路2 迷宫不存在通路五、【实验总结(Summarize)】(本部分应包括:自己在实验中完成的任务;对所完成实验的经验总结、心得)在这次数据结构课程设计中,我的题目是:迷宫问题,通过该题目的设计过程,我加深了对栈的逻辑结构,存储结构及入栈出栈过程的理解,对栈的基本运算的实现有所掌握,对课本中所学的各种数据结构进一步理解和

16、掌握,学会了如何把学到的知识用于解决实际问题,锻炼了自己动手的能力。一个人要完成所有的工作是非常困难和耗时的。在以后的学习中我会更加注意各个方面的能力的协调发展。在课程设计时遇到了很多的问题,在同学的帮助下,各种资料的查阅中,解决问题,培养了我自主动手,独立研究的能力,为今后在学习工作中能更好的发展打下了坚实的基础。六、【代码】(本部分包括:完整的代码及充分的注释)#include #include #include using namespace std;struct step /定义一个栈 int x,y,n; /x,y表示步子坐标,n表示步数;void change(char *maze

17、,int hang,int lie) /改变以下迷宫的样子,就为了好看点 for(int i=0;ihang+2;i+) for(int j=0;jlie+2;j+) switch(mazeij) case 1: mazeij=#;break;case +:case 0:case .: mazeij= ;break; void step_to_step(char *maze,step *Step,int hang,int lie,int n) /单步输出 for(int k=0;k=n;k+) for(int i=0;ihang+2;i+) for(int j=0;jlie+2;j+) if(

18、Stepk.x=i&Stepk.y=j) cout. ; else coutmazeij ; coutendl; cout这是第k步endl; getch(); void out(char *maze,int hang,int lie,int i,int j) /输出所走的路程 if(i=1&j=1) &(hang!=1&lie!=1) /若回到原点则表明无出路 coutendlendl; cout*endl; cout|-此迷宫没有出路,所走路线如下图-|endl; cout*endl; else /否则有出路 coutendlendl; cout*endl; cout|-找到迷宫出路,如图

19、所示-|endl; cout*endl; for(i=0;ihang+2;i+) /输出步子 for(j=0;jlie+2;j+) coutmazeij ; coutendl; void cure(char *maze,int hang,int lie) int i=1,j=1,n=-1; char Q; step *Step; /定义一个存储路程的栈 Step=new step hang*lie; /事先给其分配一定的空间,hang*lie表示空间足够 if(maze11=1) cout迷宫入口堵住了,无法行走!endlendl; getch(); exit(0); else n+; maz

20、eij=.; Stepn.x=i; Stepn.y=j; while(mazehanglie!=.) /由右、下、左、上的顺序判断是否走通 /1表示走不通,+表示已经走过但不通又回来的步子,.表示已经走过并通了的步子 if(mazeij+1!=1&mazeij+1!=.&mazeij+1!=+) mazeij+1=.; j=j+1; n+; Stepn.x=i; Stepn.y=j; cout第n步: 向右走到: (i,j)endl; else if(mazei+1j!=1&mazei+1j!=.&mazei+1j!=+) mazei+1j=.; i=i+1; n+; Stepn.x=i; S

21、tepn.y=j; cout第n步: 向下走到: (i,j)endl; else if(mazeij-1!=1&mazeij-1!=.&mazeij-1!=+) mazeij-1=.; j=j-1; n+; Stepn.x=i; Stepn.y=j; cout第n步: 向左走到: (i,j)endl; else if(mazei-1j!=1&mazei-1j!=.&mazei-1j!=+) mazei-1j=.; i=i-1; n+; Stepn.x=i; Stepn.y=j; cout第n步: 向上走到: (i,j)endl; else /若走不通则返回上一步 if(i=1&j=1) /当回

22、到入口时,说明无通路,结束循环 break; else mazeij=+; /将走不通的点置为+ n-; i=Stepn.x; /返回上一个点 j=Stepn.y; cout此路不通!返回至上一步: (i,j)endl; /输出返回信息 if(i=hang&j=lie) cout成功走到出口! 共n步; out(maze,hang,lie,i,j); coutendlendlendl; coutQ; coutendl; if(Q=y) change(maze,hang,lie); step_to_step(maze,Step,hang,lie,n); int main() char *maze; /定义一个迷宫,空间可动态 int hang,lie,i,j; cout请输入矩阵的行列endl; couthang; coutlie; coutendl; maze=new char *hang+2; /分配连续空间给迷宫 for(i=0;ihang+2;i+) mazei=new char lie+2; cout请输入迷宫,0表示通路,1表示墙endl; for(i=1;i=hang;i+) for(j=1;jmazeij; for(i=0;ihang+2;i+) mazei0=1; f

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

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