收藏 分享(赏)

迷宫问题的求解.doc

上传人:精品资料 文档编号:10266149 上传时间:2019-10-25 格式:DOC 页数:10 大小:222KB
下载 相关 举报
迷宫问题的求解.doc_第1页
第1页 / 共10页
迷宫问题的求解.doc_第2页
第2页 / 共10页
迷宫问题的求解.doc_第3页
第3页 / 共10页
迷宫问题的求解.doc_第4页
第4页 / 共10页
迷宫问题的求解.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、迷宫问题求解一问题描述:请设计一个算法实现迷宫问题求解。2需求分析:程序可实现用户与计算机的交互过程。在计算机显示提示信息后,可由用户输入迷宫的大小与形态,以“0”表示墙壁,以“1”表示通路。利用栈操作寻找一条从入口至出口的通路,最终输出带有路线的迷宫。3算法思想:1. 栈的设计:用计算机解迷宫问题时,通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前探索,若能走通则继续向前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。为了保证在任何位置上都能沿原路退回,显然需要用一个后进先出的结构来保存从入口到当前位置的路径。因此,可以利用“栈”来求解迷宫问题。2. 表示

2、迷宫的数据结构:设迷宫为 m 行 n 列,利用 mazemn来表示一个迷宫,mazeij=0 或 1; 其中 0 表示墙壁(不通) ,1 表示通路,当从某点向下试探时,中间点有 4 个方向可以试探, (见图)而四个角点有 2 个方向,其它边缘点有 3 个方向,为使问题简单化,用 mazem+2n+2来表示迷宫,而迷宫的四周的值全部为 0。这样做可使问题简化,每个点的试探方向全部为 4,不用再判断当前点的试探方向有几个,同时与迷宫周围是墙壁这一实际问题相一致。0 1 2 3 4 5 6 7 8 90 0 0 0 0 0 0 0 0 0 01 0 1 0 0 0 1 0 0 0 02 0 1 1

3、0 1 0 0 0 0 03 0 1 1 1 1 1 1 1 0 04 0 1 1 0 0 1 0 0 0 05 0 0 1 1 1 0 1 1 1 06 0 1 0 0 1 1 1 1 1 07 0 0 0 0 0 0 0 0 0 03. 试探方向:在上述表示迷宫的情况下,每个点有 4 个方向去试探,如当前点的坐标(x , y),与其相邻的 4 个点的坐标都可根据与该点的相邻方位而得到,如图所示。因为出口在(m ,n) ,因此试探顺序规定为:从当前位置向前试探的方向为从正东沿顺时针方向进行。为了简化问题,方便的求出新点的坐标,将从正东开始沿顺时针进行的这 4 个方向(用 0,1,2,3 表示

4、东、南、西、北)的坐标增量放在一个结构数组 direct 4 中,在该数组中,每个元素有两个域组成,x:横坐标增量,y:纵坐标增量。4. 防止重复到达某点,以避免发生死循环:定义“足迹”函数,在到达某点(i , j)后将使 maze i j 置为-1,以便区别未到达过的点,起到防止走重复点的目的。4概要设计:1. 栈的抽象数据类型的定义:ADT Stack数据对象:D=ai|aiElemSet, i=1,2,.n, n0数据关系:R1=|ai-1 D, i=1,2,.n基本操作:InitStack( /迷宫数组行列typedef struct /迷宫坐标位置类型int x; /行值 int y

5、; /列值 PosType;typedef struct /栈的元素类型int ord; /通道块在路径上的“序号” PosType seat; /通道块在迷宫中的 “坐标位置 ”int di; /从此通道块走向下一通道块的“方向”(03 表示东北) SElemType;MazeType m; /迷宫数组int curstep=1; /当前足迹,初值为 1/*栈的定义*#define STACK_INIT_SIZE 10 / 存储空间初始分配量 #define STACKINCREMENT 2 / 存储空间分配增量typedef struct SqStack/ 顺序栈SElemType *ba

6、se; / 在栈构造之前和销毁之后,base 的值为 NULL SElemType *top; / 栈顶指针 int stacksize; / 当前已分配的存储空间,以元素为单位 SqStack;int InitStack(SqStack *S)/ 构造一个空栈 S/ 为栈底分配一个指定大小的存储空间(*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType);if( !(*S).base )exit(0);(*S).top = (*S).base; / 栈底与栈顶相同表示一个空栈(*S).stacksize = STACK

7、_INIT_SIZE;return 1;int StackEmpty(SqStack S)/ 若栈 S 为空栈(栈顶与栈底相同的) ,则返回 1,否则返回 0if(S.top = S.base)return 1;elsereturn 0;int Push(SqStack *S, SElemType e)/ 插入元素 e 为新的栈顶元素if(*S).top - (*S).base = (*S).stacksize) /栈满,追加存储空间(*S).base = (SElemType *)realloc(*S).base , (*S).stacksize + STACKINCREMENT) * si

8、zeof(SElemType);if( !(*S).base )exit(0);(*S).top = (*S).base+(*S).stacksize;(*S).stacksize += STACKINCREMENT;*(*S).top)+=e;return 1;int Pop(SqStack *S,SElemType *e)/ 若栈不空,则删除 S 的栈顶元素,用 e 返回其值,并返回 1;否则返回 0if(*S).top = (*S).base)return 0;*e = *-(*S).top;return 1;/*迷宫部分的定义*/ 定义墙元素值为 0,可通过路径为 1,不能通过路径为-

9、1,通过路径为足迹int Pass(PosType b)/当迷宫 m 的 b 点的序号为 1(可通过路径),return 1; 否则,return 0if(mb.xb.y=1)return 1;elsereturn 0;void FootPrint(PosType a)/使迷宫 m 的 a 点的序号变为足迹(curstep),表示经过 ma.xa.y=curstep;PosType NextPos(PosType c,int di)/根据当前位置及移动方向,返回下一位置 PosType direc4=0,1,1,0,0,-1,-1,0; / 行增量,列增量 / 移动方向,依次为东南西北 c.x

10、+=direcdi.x;c.y+=direcdi.y;return c;void MarkPrint(PosType b)/使迷宫 m 的 b 点的序号变为-1(不能通过的路径)mb.xb.y=-1;int MazePath(PosType start,PosType end) /若迷宫 maze 中存在从入口 start 到出口 end 的通道,则求得一条/存放在栈中(从栈底到栈顶),并返回 1;否则返回 0 SqStack S;PosType curpos;SElemType e;InitStack(curpos=start;doif(Pass(curpos)/ 当前位置可以通过,即是未曾

11、走到过的通道块 FootPrint(curpos); /留下足迹 e.ord=curstep;e.seat.x=curpos.x;e.seat.y=curpos.y;e.di=0;Push( /入栈当前位置及状态 curstep+; /足迹加 1 if(curpos.x=end.xcurpos=NextPos(curpos,e.di);else/当前位置不能通过 if(!StackEmpty(S)Pop( /退栈到前一位置 curstep-;/前一位置处于最后一个方向(北) while(e.di=3 /留下不能通过的标记(-1) Pop( /退回一步 curstep-;if(e.dixy;fo

12、r(i=0;ij;coutx1y1;mx1y1=0; /定义墙的值为 0 coutendl“迷宫结构如下:“endl;Print(x,y);begin.x=1;begin.y=1;end.x=x-2;end.y=y-2; /定义起点与终点位置if(MazePath(begin,end) /求得一条通路coutendl“此迷宫从入口到出口的一条路径如下:“endl;Print(x,y); /输出此通路 elsecoutendl“此迷宫没有从入口到出口的路径“endl;return 0;6运行结果:1. 输入迷宫的总行列数(包括外墙) 。现取 7 行 7 列方阵(实际部分 6*6) 。2. 输入迷

13、宫内部“墙单元”的个数。现取 8 个,即在 6*6 方阵中有 8 个墙。3. 依次输入迷宫内部每个墙单元的行列数。现取(1,2) (2,4) (3,1) (3,2) (3,3) (4,3) (4,5) (5,3)作为墙。4. 输出原始迷宫。其中 0 表示墙壁,1 表示通路。5. 输出迷宫与通路。从第二行第二列(起点)开始用 1、2、3、4的正数数列表示步数,直至右下角出口(此例为第六行第六列) 。当输入的迷宫没有通路时7小结:栈是限定仅在表尾进行插入或产出操作的线性表,因此有着“后进先出”的固有特性,致使骑成为程序设计中的有用工具。本程序利用栈的特性解决迷宫问题,并用有序正数数列标出走出迷宫的路径。通过此次迷宫问题课程设计,我对栈的数据结构、功能原理以及实践应用有了更加深入的了解。本程序特点是不需要把整个迷宫输入,而是只需要输入“墙”的位置,从而使操作简化。另外通过有序正数数列标识出走出迷宫的路径,也十分清晰。而通过对 begin 与 end 的修改可以灵活的设置迷宫的入口与出口(本程序默认设置,可以通过 cin 语句由用户指定出入口) 。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报