版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/目录第一部分需求分析第二部分详细设计第三部分调试分析第四部分用户手册第五部分测试结果第六部分附录第七部分参考文献需求分析1、对于给定的一个迷宫.给出一个出口和入口.找一条从入口到出口的通路.并把这条通路显示出来;如果没有找到这样的通路给出没有这样通路的信息。2、可以用一个m×n的长方阵表示迷宫.0和1分别表示迷宫中的通路和障碍。设计一个程序.对任意设定的迷宫.求出一条从入口到出口的通路.或得出没有通路的结论。3、编写一个求解迷宫的非递归程序。求得的通路以三元组<i.j.d>的形式输出.其中:<i.j>指示迷宫中的一个坐标.d表示走到下一坐标的方向。4、由于迷宫是任意给定的.所以程序要能够对给定的迷宫生成对应的矩阵表示.所以程序的输入包括了矩阵的行数、列数、迷宫内墙的个数、迷宫内墙的坐标、所求的通路的入口坐标、出口坐标。二、详细设计1、计算机解迷宫通常用的是"穷举求解"方法.即从人口出发.顺着某一个方向进行探索.若能走通.则继续往前进;否则沿着原路退回.换一个方向继续探索.直至出口位置.求得一条通路。假如所有可能的通路都探索到而未能到达出口.则所设定的迷宫没有通路。可以二维数组存储迷宫数据.通常设定入口点的下标为<1.1>.出口点的下标为<n.n>。为处理方便起见.可在迷宫的四周加一圈障碍。对于迷宫中任一位置.均可约定有东、南、西、北四个方向可通。2、如果在某个位置上四个方向都走不通的话.就退回到前一个位置.换一个方向再试.如果这个位置已经没有方向可试了就再退一步.如果所有已经走过的位置的四个方向都试探过了.一直退到起始点都没有走通.那就说明这个迷宫根本不通。3、所谓"走不通"不单是指遇到"墙挡路".还有"已经走过的路不能重复走第二次".它包括"曾经走过而没有走通的路"。
显然为了保证在任何位置上都能沿原路退回.需要用一个"后进先出"的结构即栈来保存从入口到当前位置的路径。并且在走出出口之后.栈中保存的正是一条从入口到出口的路径。4、若当前位置"可通".则纳入"当前路径".并继续朝"下一位置"探索;若当前位置"不可通".则应顺着"来的方向"退回到"前一通道块".然后朝着除"来向"之外的其他方向继续探索;若该通道块的四周四个方块均"不可通".则应从"当前路径"上删除该通道块。所谓"下一位置"指的是"当前位置"四周四个方向〔东、南、西、北上相邻的方块。假设以栈S记录"当前路径".则栈顶中存放的是"当前路径上最后一个通道块"。由此."纳入路径"的操作即为"当前位置入栈";"从当前路径上删除前一通道块"的操作即为"出栈"。5、找通路的程序的关键部分可以表示如下:do{
若当前位置可通.
则{
将当前位置插入栈顶;//纳入路径
若该位置是出口位置.则算法结束;
//此时栈中存放的是一条从入口位置到出口位置的路径
否则切换当前位置的东邻方块为新的当前位置;
}否则{
若栈不空且栈顶位置尚有其他方向未被探索.
则设定新的当前位置为:沿顺时针方向旋转找到的栈顶位置的下一相邻块;
若栈不空但栈顶位置的四周均不可通.
则{删去栈顶位置;//从路径中删去该通道块
若栈不空.则重新测试新的栈顶位置.
直至找到一个可通的相邻块或出栈至栈空;
}}}while<栈不空>;6、程序中用的数据结构解析:①程序中用了顺序栈保存当前找到的路径.当前位置不可通时.可以出栈.退回到前一个位置再继续探索通路.栈的定义如下:structSqStack{SElemType*base;//在栈构造之前和销毁之后.base的值为NULLSElemType*top;//栈顶指针intstacksize;//当前已分配的存储空间.以元素为单位};//顺序栈②栈中元素的类型结构程序中先定义了一个表示坐标的类型结构:structPosType//迷宫坐标位置类型{intx;//行值inty;//列值};栈中元素的类型结构如下:structSElemType//栈的元素类型{intord;//通道块在路径上的"序号"PosTypeseat;//通道块在迷宫中的"坐标位置"intdi;//从此通道块走向下一通道块的"方向"<0~3表示东~北>};7、主函数的流程图输出从起点到终点的坐标显示当前含有通路的迷宫结构输出没有这样的通路输入所求通路的起点终点坐标显示当前的迷宫的结构设置内墙设置外墙输入迷宫的行数列数〔包括外墙输出从起点到终点的坐标显示当前含有通路的迷宫结构输出没有这样的通路输入所求通路的起点终点坐标显示当前的迷宫的结构设置内墙设置外墙输入迷宫的行数列数〔包括外墙调试分析1、对于程序的设计由简单到复杂.先设计一个整体的轮廓然后再慢慢的增加程序的功能.这样能够有效的减少错误.功能慢慢的增加.在前一步的程序运行通过之后再继续增加功能.这样在检查错误的时候比较有目的性.提高写程序的效率。2、对于程序中的错误.如果遇到说变量没有定义或者数据结构没定义的错误.可能是由于你在定义这种数据结构的变量时数据结构还没有定义.也就是说在定义此数据结构的变量的语句要放在声明这种结构体之后。3、在写程序时要注意printf和scanf语句的格式.格式不对会得不到你想要的结果。4、写程序时一定要瞻前顾后.前后一致.包括名称、数据类型等等。四、用户手册在使用程序时严格按照程序给出的提示一步一步来.下面给出程序正常执行的步骤:1、程序会提示"请输入迷宫的行数.列数〔包括外墙:".这时就需要输入表示迷宫的二维数组的行数和列数.需要注意的是由于我们在迷宫周围加了一道墙.所以要输入的行列数要比实际表示迷宫的行列数多两行两列。2、程序提示"请输入迷宫内墙单元数:".此时需要输入迷宫中墙的数目。3、程序提示"请依次输入迷宫内墙每个单元的行数.列数:".此时要输入迷宫中所有墙的坐标.我们用数组中的一个元素来表示墙。4、在输入了迷宫所有内墙的坐标后.程序会显示出迷宫的结构.然后程序会提示"请输入起点的行数.列数:".此时需要输入所求通路的起点坐标。5、程序提示"请输入终点的行数.列数:".此时需要输入所求通路的终点的坐标。6、终点坐标输入完毕之后.程序会显示出两种运行的结果.一种是输出了迷宫的结构.此时迷宫中已包含了所找的通路.用连续的数字表示出了通路在迷宫中是如何走的.此时迷宫中的-1表示找通路时走过的单元但是通路不通。注意:再输入内墙单元的坐标是一定要细心.不要错输.也不要漏输。否则程序会出错。五、测试结果迷宫的测试数据如下:左上角<1.1>为入口.右下角<9.8>为出口。12345678001000100010001000001101011100100001000001000101011110011100010111000000程序的测试结果为:1、程序的开始界面2、输入迷宫的行数列数之后3、输入内墙的个数之后4、再输入了所有内墙的坐标后.程序会给出迷宫的结构5、输入所求通路的起点坐标6、输入所求通路的终点坐标后会得到结果①结果以迷宫的形式输出②结果用坐标和下一位值的方向表示六、附录〔附有完整的源程序源程序如下:#include"stdio.h"#include"stdlib.h"#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineOVERFLOW-2typedefintStatus;#defineSTACK_INIT_SIZE10//存储空间初始分配量#defineSTACKINCREMENT2//存储空间分配增量structPosType//迷宫坐标位置类型{intx;//行值inty;//列值};structSElemType//栈的元素类型{intord;//通道块在路径上的"序号"PosTypeseat;//通道块在迷宫中的"坐标位置"intdi;//从此通道块走向下一通道块的"方向"<0~3表示东~北>};structSqStack{SElemType*base;//在栈构造之前和销毁之后.base的值为NULLSElemType*top;//栈顶指针intstacksize;//当前已分配的存储空间.以元素为单位};//顺序栈SqStackS;#defineMAXLENGTH25//设迷宫的最大行列为25typedefintMazeType[MAXLENGTH][MAXLENGTH];//迷宫数组[行][列]//全局变量MazeTypem;//迷宫数组intcurstep=1;//当前足迹,初值为1StatusInitStack<SqStack&S>{//构造一个空栈Sif<!<S.base=<SElemType*>malloc<STACK_INIT_SIZE*sizeof<SElemType>>>>exit<OVERFLOW>;//存储分配失败S.top=S.base;S.stacksize=STACK_INIT_SIZE;returnOK;}StatusStackEmpty<SqStackS>{//若栈S为空栈.则返回TRUE.否则返回FALSEif<S.top==S.base>returnTRUE;elsereturnFALSE;}StatusPush<SqStack&S,SElemTypee>{//插入元素e为新的栈顶元素if<S.top-S.base>=S.stacksize>//栈满.追加存储空间{S.base=<SElemType*>realloc<S.base,<S.stacksize+STACKINCREMENT>*sizeof<SElemType>>;if<!S.base>exit<OVERFLOW>;//存储分配失败S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*<S.top>++=e;returnOK;}StatusPop<SqStack&S,SElemType&e>{//若栈不空.则删除S的栈顶元素.用e返回其值.并返回OK;否则返回ERRORif<S.top==S.base>returnERROR;e=*--S.top;returnOK;}StatusPass{//当迷宫m的b点的序号为0<可通过路径>.returnOK;否则.returnERROR。if<m[b.x][b.y]==0>returnOK;elsereturnERROR;}voidFootPrint<PosTypea>{//使迷宫m的a点的序号变为足迹<curstep>m[a.x][a.y]=curstep;}PosTypeNextPos<PosTypec,intdi>{//根据当前位置及移动方向.返回下一位置PosTypedirec[4]={{0,1},{1,0},{0,-1},{-1,0}};//{行增量,列增量}//移动方向,依次为东南西北c.x+=direc[di].x;c.y+=direc[di].y;returnc;}voidMarkPrint<PosTypeb>{//使迷宫m的b点的序号变为-1<不能通过的路径>m[b.x][b.y]=-1;}StatusMazePath<PosTypestart,PosTypeend>//算法3.3{//若迷宫maze中存在从入口start到出口end的通道.则求得一条//存放在栈中<从栈底到栈顶>.并返回TRUE;否则返回FALSEPosTypecurpos;InitStack<S>;SElemTypee;curpos=start;do{if<Pass<curpos>>{//当前位置可以通过.即是未曾走到过的通道块FootPrint<curpos>;//留下足迹e.ord=curstep;e.seat.x=curpos.x;e.seat.y=curpos.y;e.di=0;Push<S,e>;//入栈当前位置及状态curstep++;//足迹加1if<curpos.x==end.x&&curpos.y==end.y>//到达终点<出口>returnTRUE;curpos=NextPos<curpos,e.di>;}else{//当前位置不能通过if<!StackEmpty<S>>{Pop<S,e>;//退栈到前一位置curstep--;while<e.di==3&&!StackEmpty<S>>//前一位置处于最后一个方向<北>{MarkPrint<e.seat>;//留下不能通过的标记<-1>Pop<S,e>;//退回一步curstep--;}if<e.di<3>//没到最后一个方向<北>{e.di++;//换下一个方向探索Push<S,e>;curstep++; curpos=NextPos<e.seat,e.di>;//设定当前位置是该新方向上的相邻块}}}}while<!StackEmpty<S>>;returnFALSE;}voidPrint<intx,inty>{//输出迷宫的解inti,j;for<i=0;i<x;i++>{for<j=0;j<y;j++>printf<"%3d",m[i][j]>;printf<"\n">;}}voidmain<>{PosTypebegin,end;inti,j,x,y,x1,y1;SElemTypea;SqStackT;InitStack<T>;printf<"请输入迷宫的行数,列数<包括外墙>:">;scanf<"%d%d",&x,&y>;for<i=0;i<y;i++>//定义周边值为0<同墙>{m[0][i]=1;//行周边m[x-1][i]=1;}for<j=1;j<x-1;j++>{m[j][0]=1;//列周边m[j][y-1]=1;}for<i=1;i<x-1;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江省杭州市2026年初中学业水平模拟考试语文试题卷附答案
- AI芯片架构助力智能制造的发展与挑战
- 微机原理与接口技术
- 山东省济宁市兖州区2025-2026学年高一下学期期中考试数学试卷
- 2025年4月通信专业技术人员职业水平考试试题与答案
- 2025年广播电视编辑记者、播音员主持人资格考试(广播电视基础知识)模拟试题(广东省)
- 2025年全国广播电视播音员主持人资格考试(广播电视播音主持业务)复习题库及答案
- 2025年全国广播电视播音员主持人资格考试(广播电视播音主持业务)考前模拟试题及答案
- 2025年河南高考地理真题(纯答案版)
- AGV智能搬运小车及其部件高性能减震器项目可行性研究报告模板-立项备案
- 2025年书记员速录技能考试真题及答案
- 2026年卫生统计学模拟试题+参考答案
- (2026年)共青团入团考试试题(含答案)
- 2026年广东东莞市中考数学二模模拟试卷试题(含答案详解)
- 中耳胆脂瘤手术切除治疗
- 2026年技术经纪人练习题【模拟题】附答案详解
- 2026年夏令营行业分析报告及未来发展趋势报告
- 总包对分包的管理排查清单
- 中国海洋石油集团有限公司2026届校园招聘笔试历年难易错考点试卷带答案解析
- 2026年湖南娄底市中考生物试题及答案
- 2025年广西壮族自治区柳州市初二学业水平地生会考真题试卷+答案
评论
0/150
提交评论