




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构课程设计课程名称:数据结构题目:迷宫设计系别:软件学院专业:移动设备应用开发班级: 15 级移动 1 班姓名:黄国峰学期:2016-2017第一学期指导教师:李博时间:2016 年 12月目录第一部分需求分析第二部分详细设计第三部分调试分析第四部分用户手册第五部分测试结果第六部分附录第七部分参考文献一、 需求分析1 、对于给定的一个迷宫,给出一个出口和入口,找一条从入口到出口的通路,并把这条通路显示出来;如果没有找到这样的通路给出没有这样通路的信息。2、可以用一个m n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出
2、没有通路的结论。3、编写一个求解迷宫的非递归程序。求得的通路以三元组(i , j , d) 的形式输出,其中: (i , j) 指示迷宫中的一个坐标, d 表示走到下一坐标的方向。4、手动设置迷宫是任意给定的,所以程序要能够对给定的迷宫生成对应的矩阵表示,所以程序的输入包括了矩阵的行数、列数、迷宫内墙的个数、迷宫内墙的坐标、所求的通路的入口坐标、出口坐标。5、自动生成的迷宫原理很简单,因为0 和 1 分别代表通道和障碍物,所以只需要随机生成0 和 1 然后再给最外围都赋值为 1,就形成了新的迷宫。二、详细设计1 、计算机解迷宫通常用的是“穷举求解“方法,即从人口出发,顺着某一个方向进行探索,若
3、能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。可以二维数组存储迷宫数据,通常设定入口点的下标为 (1 , 1) ,出口点的下标为 (n , n) 。为处理方便起见,可在迷宫的四周加一圈障碍。对于迷宫中任一位置,均可约定有东、南、西、北四个方向可通。2、如果在某个位置上四个方向都走不通的话,就退回到前一个位置,换一个方向再试,如果这个位置已经没有方向可试了就再退一步,如果所有已经走过的位置的四个方向都试探过了,一直退到起始点都没有走通,那就说明这个迷宫根本不通。3、所谓 "走不通
4、 "不单是指遇到 "墙挡路 " ,还有 " 已经走过的路不能重复走第二次 " ,它包括 " 曾经走过而没有走通的路" 。显然为了保证在任何位置上都能沿原路退回, 需要用一个" 后进先出 "的结构即栈来保存从入口到当前位置的路径。并且在走出出口之后,栈中保存的正是一条从入口到出口的路径。4、若当前位置“可通” ,则纳入“当前路径” ,并继续朝“下一位置”探索;若当前位置“不可通” ,则应顺着“来的方向”退回到“前一通道块” ,然后朝着除“来向”之外的其他方向继续探索;若该通道块的四周四个方块均“不可通” ,
5、则应从“当前路径”上删除该通道块。所谓“下一位置”指的是“当前位置”四周四个方向(东、南、西、北)上相邻的方块。假设以栈S 记录“当前路径” ,则栈顶中存放的是“当前路径上最后一个通道块” 。 由此, “纳入路径” 的操作即为 “当前位置入栈” ;“从当前路径上删除前一通道块”的操作即为“出栈” 。5、找通路的程序的关键部分可以表示如下:do若当前位置可通,则将当前位置插入栈顶; / 纳入路径若该位置是出口位置,则算法结束;/ 此时栈中存放的是一条从入口位置到出口位置的路径否则切换当前位置的东邻方块为新的当前位置;否则若栈不空且栈顶位置尚有其他方向未被探索,则设定新的当前位置为 : 沿顺时针方
6、向旋转找到的栈顶位置的下一相邻块;若栈不空但栈顶位置的四周均不可通,则 删去栈顶位置; / 从路径中删去该通道块若栈不空,则重新测试新的栈顶位置,直至找到一个可通的相邻块或出栈至栈空; while ( 栈不空 ) ;6 、程序中用的数据结构解析: 程序中用了顺序栈保存当前找到的路径,当前位置不可通时,可以出栈,退回到前一个位置再继续探索通路,栈的定义如下:struct SqStackSElemType *base; / 在栈构造之前和销毁之后, base 的值为 NULLSElemType *top; / 栈顶指针int stacksize; / 当前已分配的存储空间,以元素为单位; / 顺序
7、栈 栈中元素的类型结构程序中先定义了一个表示坐标的类型结构:struct PosType /迷宫坐标位置类型int x; /行值int y; /列值;栈中元素的类型结构如下:struct SElemType 栈的元素类型int ord; 通道块在路径上的序号PosType seat; 通道块在迷宫中的坐标位置int di; /从此通道块走向下一通道块的方向(03表示东;7、主函数的流程图输入迷宫的行数列数(包括外墙)设置外墙设置内墙显示当前输入所求通路的起点终点坐标输出没有显示当前含有通路的迷宫结构输出从起点到终点的坐标手动设置自动生三、调试分析1、对于程序的设计由简单到复杂,先设计一个整体的
8、轮廓然后再慢慢的增 加程序的功能,这样能够有效的减少错误,功能慢慢的增加,在前一步的程 序运行通过之后再继续增加功能,这样在检查错误的时候比较有目的性,提高写程序的效率。2、对于程序中的错误,如果遇到说变量没有定义或者数据结构没定义的错误,可能是由于你在定义这种数据结构的变量时数据结构还没有定义,也就是说在定义此数据结构的变量的语句要放在声明这种结构体之后。3、在写程序时要注意printf 和 scanf 语句的格式,格式不对会得不到你想要的结果。4、写程序时一定要瞻前顾后,前后一致,包括名称、数据类型等等。四、用户手册在使用程序时严格按照程序给出的提示一步一步来,下面给出程序正常执行的步骤:
9、1、程序会提示“请输入迷宫的行数,列数(包括外墙) : ” ,这时就需要输入表示迷宫的二维数组的行数和列数, 需要注意的是由于我们在迷宫周围加了一道墙,所以要输入的行列数要比实际表示迷宫的行列数多两行两列。 、 程序提示 “请输入迷宫内墙单元数: ” , 此时需要输入迷宫中墙的数目。3、程序提示“请依次输入迷宫内墙每个单元的行数,列数:” ,此时要输入迷宫中所有墙的坐标,我们用数组中的一个元素来表示墙。4、在输入了迷宫所有内墙的坐标后,程序会显示出迷宫的结构,然后程序会提示 “请输入起点的行数, 列数: ” , 此时需要输入所求通路的起点坐标。5、程序提示“请输入终点的行数,列数:” ,此时需
10、要输入所求通路的终点的坐标。6、终点坐标输入完毕之后,程序会显示出两种运行的结果,一种是输出了迷宫的结构,此时迷宫中已包含了所找的通路,用连续的数字表示出了通路在迷宫中是如何走的,此时迷宫中的-1表示找通路时走过的单元但是通路 不通。注意:再输入内墙单元的坐标是一定要细心,不要错输,也不要漏输。否则程序会出错。五、测试结果 迷宫的测试数据如下:左上角(1 , 1)为入口,右下角(9, 8)为出口。1 2 3 4 5 6 7 8001000100010001000001101011100100001000001000101011110011100010111000000程序的测试结果为:1、 程
11、序的开始界面六、附录(附有完整的源程序)源程序如下:#include <stdio.h>#include <stdlib.h># define TRUE 1# define FALSE 0# define OK 1# define ERROR 0# define OVERFLOW -2# define STACKINCREMENT 10# define STACK_INIT_SIZE 100/ 初始长度 typedef int Status;struct PosType /坐标竖直为x,横为yint x;int y;struct SElemType int ord; /
12、 序号 1, 2, 3, 4, 5, 6 路径的序号PosType seat; / 坐标int di; / 移动方向:上下左右;struct SqStack SElemType *base;SElemType *top;int stacksize;SqStack S;#define MAXLENGTH 30typedef int MazeTypeMAXLENGTHMAXLENGTH; / 将数组做成地图。 MazeType m; / 宏定义,定义一个数组地图int curstep=2; / curstep 代表的是足迹,走过的路Status InitStack(SqStack &S)
13、S.base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType);/ 开空间, 栈底是表头if(!S.base) exit(OVERFLOW);/ 检查是否开辟成功S.top=S.base;/ 设为空栈S.stacksize=STACK_INIT_SIZE;/ 设置长度 return OK;Status Pop(SqStack &S,SElemType &e)/ 得到栈顶元素if(S.base=S.top) return ERROR;/ 检查是否为空栈 ,若为空则没有栈顶 e=*-S.top; /栈的特殊存储方式retu
14、rn OK;Status StackEmpty(SqStack &S)/ 判断是否为空 if(!S.base) return ERROR;if(S.base=S.top) return TRUE;/ 为空 else return FALSE;Status Push(SqStack &S,SElemType e)/ 进栈if(S.top-S.base>=S.stacksize)/ 栈不满 S.base=(SElemType *) realloc (S.base,(S.stacksize+STACKINCREMENT) * sizeof(SElemType);/ 开空间if(
15、!S.base) exit(OVERFLOW);/ 检查是否开空间成功S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;/ 压进栈里面return OK;Status Pass(PosType a)/ 传参传的是当前位置的坐标 / 检查当前位置是墙还是通道if(ma.xa.y=0)return OK; elsereturn ERROR;Status FootPrint(PosType a)/ 对已经走过的路做成标记1 , 2, 3, 4. 。ma.xa.y=curstep;PosType NextPos(PosType
16、 c,int di)/0-3 上下左右/ 作用是移动一个位置,所以需要传进来位置,移动方向,毕竟位移量已经确定为 1PosType direc4=-1,0,1,0,0,-1,0,1;/上下左右c.x+=direcdi.x;c.y+=direcdi.y;return c;void MarkPrint(PosType a)/ 走不通ma.xa.y=-1;/ 此路不通void Print(int x,int y) /迷宫的输出int i,j;for(i=0;i<x;i+)for(j=0;j<y;j+)if(mij=1)printf(" ");elseprintf(&q
17、uot; 匚"); printf("n");void Print1(int x,int y)/ 有通路的迷宫的输出int i,j;for(i=0;i<x;i+)for(j=0;j<y;j+)if(mij=1) printf(" ");else if(mij=-1|mij=0)printf(" 匚 ");else if(mij>=2) printf(""); printf("n");Status MazePath(PosType start,PosType end)/
18、找通路InitStack(S);/ 保存可以走的路径SElemType e;PosType curpos=start;/curpos 是指当前位置,将开始位置设为当前位置 doif(Pass(curpos)/ 如果当前位置的序号为0,即此位置不是迷宫中的墙即为能走的路。 FootPrint(curpos);/ 留下标记e.ord=curstep; / 输出的时候的 1, 2, 3, 4, 5e.di=0;Push(S,e);/ 将这一步记录,压进栈中curstep+; / 再走一步 和 ord 一个性质,路径的步数if(curpos.x=end.x&&curpos.y=end.
19、y) return TRUE;/ 如果已经是出口就完 成栈的记录curpos=NextPos(curpos,e.di);/ 否则就 走一步else/ 如果当前位置是走过得 意思就是它的 序号不是 0if(!StackEmpty(S)/ 判断栈是不是空,不是空就后退到上一步Pop(S,e);/ 后退到上一步 curstep-;while(e.di=3&&!StackEmpty(S)/ 后退直到 找到能走的路 MarkPrint(e.seat);Pop(S,e); curstep-; if(e.di<3)/0 3代表上下左右e.di+;Push(S,e);curstep+;c
20、urpos=NextPos(e.seat,e.di);/ 下一步怎么移动while(!StackEmpty(S);return FALSE;void Auto_maze(int x,int y)int i,j;printf("n 迷宫生成中nn");system("pause");for(i=0;i<x;i+)for(j=0;j<y;j+)mij=rand()%2;void GenerateMaze(int x,int y)/ 生成迷宫地图int i,j;int x1,y1;/ 障碍物坐标for(i=0;i<y;i+)m0i=1;mx-
21、1i=1;for(j=0;j<x;j+) mj0=1;mjy-1=1;for(i=1;i<x-1;i+)for(j=1;j<y-1;j+)mij=0;printf(" 输入迷宫里面阻碍物的个数:");scanf("%d",&j);printf(" 请输入迷宫中障碍物坐标: n");for(i=0;i<j;i+)scanf("%d%d",&x1,&y1);mx1y1=1;printf("I*n");Print(x,y);printf("I*
22、迷宫图迷宫图*n");void Movingdirection(SElemType a)/ 用来显示迷宫通路怎么走的switch(a.di)case 0:printf("%d%3dTbreak;case 1:printf("%d%3d break;case 2:printf("%d%3d break;case 3:printf("%d%3d break;void MazePathway(PosType begin,PosType end,int x,int y)/ 显示迷宫通路图 SElemType a;SqStack T;InitStack(
23、T);if(MazePath(begin,end)printf(" 迷宫通路如下图所示:n");Print1(x,y);while(!StackEmpty(S)Pop(S,a);Push(T,a);printf(" 找到的路径用坐标表示如下 :n");while(!StackEmpty(T)Pop(T,a);Movingdirection(a); elseprintf(" 迷宫中没有出路。 n");int main()PosType begin,end;int x,y;int n;int i,j;while(1) printf("*1.手动输入。*n");printf("*2.自动生成。*n");printf("*3.退 出。*n");printf(" 请输入: ")
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 住宅类合同范本
- 2025年隔音房行业深度研究分析报告-20241226-200706
- 中国卤化银感光相纸行业发展监测及投资战略研究报告
- 贵州国际化教育发展项目前期可行性研究报告
- 2025年度个人股份收益权转让协议模板(互联网平台)
- 二手设备采购标准合同范本
- 2025年度独占许可协议名词释义与技术创新应用
- 2025年度厂房装修工程合同履约保证金协议
- 2025年度抚养权变更与子女心理辅导协议
- 咖啡连锁办公环境装修合同
- 中国结核病预防性治疗指南
- 危重症呼吸支持治疗
- 新课标初中语文7-9年级必背古诗文言文
- 不忘教育初心-牢记教师使命课件
- 药品不良反应及不良反应报告课件
- FSC认证培训材料
- Germany introduction2-德国国家介绍2
- 精素材:描写植物的好词好句好段
- 急危重症患者静脉通路的建立与管理月教学课件
- 【高中语文】《登岳阳楼》课件17张+统编版高中语文必修下册
- 火力发电厂总经理岗位规范
评论
0/150
提交评论