1、第一部分 需求分析第二部分 详细设计第三部分 调试分析第四部分 用户手册第五部分 测试结果第六部分 附录第七部分 参考文献一、需求分析 1、对于给定的一个迷宫,给出一个出口和入口,找一条从入口到出口的通路,并把这条通路显示出来;如果没有找到这样的通路给出没有这样通路的信息。2、可以用一个mn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。3、编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。4、手动设置迷宫是任意给定的,所
2、以程序要能够对给定的迷宫生成对应的矩阵表示,所以程序的输入包括了矩阵的行数、列数、迷宫内墙的个数、迷宫内墙的坐标、所求的通路的入口坐标、出口坐标。5、自动生成的迷宫原理很简单,因为0和1分别代表通道和障碍物,所以只需要随机生成0和1然后再给最外围都赋值为1,就形成了新道块的四周四个方块均“不可通”,则应从“当前路径”上删除该通道块。所谓“下一位置”指的是“当前位置”四周四个方向(东、南、西、北)上相邻的方块。假设以栈S记录“当前路径”,则栈顶中存放的是“当前路径上最后一个通道块”。由此,“纳入路径”的操作即为“当前位置入栈”;“从当前路径上删除前一通道块”的操作即为“出栈”。5、找通路的程序的
3、关键部分可以表示如下:do 若当前位置可通, 则将当前位置插入栈顶; / 纳入路径 若该位置是出口位置,则算法结束; / 此时栈中存放的是一条从入口位置到出口位置的路径否则切换当前位置的东邻方块为新的当前位置; 否则若栈不空且栈顶位置尚有其他方向未被探索, 则设定新的当前位置为: 沿顺时针方向旋转找到的栈顶位置的下一相邻块; 若栈不空但栈顶位置的四周均不可通, 则 删去栈顶位置; / 从路径中删去该通道块若栈不空,则重新测试新的栈顶位置, 直至找到一个可通的相邻块或出栈至栈空; while (栈不空); 6、程序中用的数据结构解析: 程序中用了顺序栈保存当前找到的路径,当前位置不可通时,可以出
4、栈,退回到前一个位置再继续探索通路,栈的定义如下:struct SqStack SElemType *base; / 在栈构造之前和销毁之后,base的值为NULL SElemType *top; / 栈顶指针 int stacksize; / 当前已分配的存储空间,以元素为单位; / 顺序栈 栈中元素的类型结构程序中先定义了一个表示坐标的类型结构:struct PosType / 迷宫坐标位置类型 int x; / 行值 int y; / 列值 ;栈中元素的类型结构如下:struct SElemType / 栈的元素类型 int ord; / 通道块在路径上的序号 PosType seat;
5、 / 通道块在迷宫中的坐标位置 int di; / 从此通道块走向下一通道块的方向(03表示东北)7、主函数的流程图三、调试分析1、对于程序的设计由简单到复杂,先设计一个整体的轮廓然后再慢慢的增加程序的功能,这样能够有效的减少错误,功能慢慢的增加,在前一步的程序运行通过之后再继续增加功能,这样在检查错误的时候比较有目的性,提高写程序的效率。2、对于程序中的错误,如果遇到说变量没有定义或者数据结构没定义的错误,可能是由于你在定义这种数据结构的变量时数据结构还没有定义,也就是说在定义此数据结构的变量的语句要放在声明这种结构体之后。3、在写程序时要注意printf和scanf语句的格式,格式不对会得
6、不到你想要的结果。4、写程序时一定要瞻前顾后,前后一致,包括名称、数据类型等等。四、用户手册在使用程序时严格按照程序给出的提示一步一步来,下面给出程序正常执行的步骤:1、程序会提示“请输入迷宫的行数,列数(包括外墙):”,这时就需要输入表示迷宫的二维数组的行数和列数,需要注意的是由于我们在迷宫周围加了一道墙,所以要输入的行列数要比实际表示迷宫的行列数多两行两列。2、程序提示“请输入迷宫内墙单元数:”,此时需要输入迷宫中墙的数目。3、程序提示“请依次输入迷宫内墙每个单元的行数,列数:”,此时要输入迷宫中所有墙的坐标,我们用数组中的一个元素来表示墙。4、在输入了迷宫所有内墙的坐标后,程序会显示出迷
7、宫的结构,然后程序会提示“请输入起点的行数,列数:”,此时需要输入所求通路的起点坐标。5、程序提示“请输入终点的行数,列数:”,此时需要输入所求通路的终点的坐标。6、终点坐标输入完毕之后,程序会显示出两种运行的结果,一种是输出了迷宫的结构,此时迷宫中已包含了所找的通路,用连续的数字表示出了通路在迷宫中是如何走的,此时迷宫中的-1表示找通路时走过的单元但是通路不通。注意:再输入内墙单元的坐标是一定要细心,不要错输,也不要漏输。否则程序会出错。五、测试结果迷宫的测试数据如下:左上角(1,1)为入口,右下角(9,8)为出口。 1 2 3 4 5 6 7 81程序的测试结果为:1、程序的开始界面六、附
8、录(附有完整的源程序)源程序如下:#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,横为y struct SElemType /序号1,2,3,4,5,6.路径的序号 /坐标 /移动方向:上下左右 SqStack S;#define MAXLENGTH 30 ty
9、pedef int MazeTypeMAXLENGTHMAXLENGTH; / 将数组做成地图。MazeType m; / 宏定义,定义一个数组地图 int curstep=2; / curstep代表的是足迹,走过的路 Status InitStack(SqStack &S) S.base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType);/开空间,栈底是表头 if(!S.base) exit(OVERFLOW);/检查是否开辟成功 S.top=S.base;/设为空栈 S.stacksize=STACK_INIT_SIZE;/设置
10、长度 return OK;Status Pop(SqStack &S,SElemType &e)/得到栈顶元素 if(S.base=S.top) return ERROR;/检查是否为空栈 ,若为空则没有栈顶 e=*-S.top; /栈的特殊存储方式 Status StackEmpty(SqStack &S)/判断是否为空 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.stacksi
11、ze)/栈不满 S.base=(SElemType *) realloc (S.base,(S.stacksize+STACKINCREMENT) * sizeof(SElemType);/开空间 if(!/检查是否开空间成功 S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; *S.top+=e;/压进栈里面 Status Pass(PosType a)/传参传的是当前位置的坐标 /检查当前位置是墙还是通道 if(ma.xa.y=0) return OK; else return ERROR;Status FootPrint(PosT
12、ype a)/对已经走过的路做成标记 1,2,3,4.。 ma.xa.y=curstep;PosType NextPos(PosType c,int di)/0-3上下左右 /作用是移动一个位置,所以需要传进来位置,移动方向,毕竟位移量已经确定为1 PosType 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;ix;i+) for(j=0;jy;j+) if(mij=1) printf();匚 n void Print1(int x,int y)/有通路的迷宫的输出 if(
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1