收藏 分享(赏)

数据结构实验-迷宫问题.doc

上传人:精品资料 文档编号:10298741 上传时间:2019-10-28 格式:DOC 页数:14 大小:240.99KB
下载 相关 举报
数据结构实验-迷宫问题.doc_第1页
第1页 / 共14页
数据结构实验-迷宫问题.doc_第2页
第2页 / 共14页
数据结构实验-迷宫问题.doc_第3页
第3页 / 共14页
数据结构实验-迷宫问题.doc_第4页
第4页 / 共14页
数据结构实验-迷宫问题.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、实验报告实验课名称:数据结构实验实验名称:迷宫问题班级:20130613 学号:16 姓名:施洋 时间:2015-5-18一、问题描述这是心理学中的一个经典问题。心理学家把一只老鼠从一个无顶盖的大盒子的入口处放入,让老鼠自行找到出口出来。迷宫中设置很多障碍阻止老鼠前行,迷宫唯一的出口处放有一块奶酪,吸引老鼠找到出口。简而言之,迷宫问题是解决从布置了许多障碍的通道中寻找出路的问题。本题设置的迷宫如图 1 所示。入 口出 口图 1 迷宫示意图 迷宫四周设为墙;无填充处,为可通处。设每个点有四个可通方向,分别为东、南、西、北。左上角为入口。右下角为出口。迷宫有一个入口,一个出口。设计程序求解迷宫的一

2、条通路。二、数据结构设计以一个 mn 的数组 mg 表示迷宫,每个元素表示一个方块状态,数组元素 0 和1 分别表示迷宫中的通路和障碍。迷宫四周为墙,对应的迷宫数组的边界元素均为 1。根据题目中的数据,设置一个数组 mg 如下int mgM+2N+2=1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1;在算法中用到的栈采用顺序存储结构,将栈定义为Struct int i; /当前方块的行号int j; /当前方块的列号int di; /di 是下一个相邻的

3、可走的方位号stMaxSize;/ 定义栈int top=-1 /初始化栈三、算法设计要寻找一条通过迷宫的路径,就必须进行试探性搜索,只要有路可走就前进一步,无路可进,换一个方向进行尝试;当所有方向均不可走时,则沿原路退回一步(称为回溯) ,重新选择未走过可走的路,如此继续,直至到达出口或返回入口(没有通路) 。在探索前进路径时,需要将搜索的踪迹记录下来,以便走不通时,可沿原路返回到前一个点换一个方向再进行新的探索。后退的尝试路径与前进路径正好相反,因此可以借用一个栈来记录前进路径。方向:每一个可通点有 4 个可尝试的方向,向不同的方向前进时,目的地的坐标不同。预先把 4 个方向上的位移存在一

4、个数组中。如把上、右、下、左(即顺时针方向)依次编号为 0、1、2、3.其增量数组 move4如图 3 所示。move4 x y0 -1 01 0 12 1 03 0 -1图 2 数组 move4方位示意图如下:通路:通路上的每一个点有 3 个属性:一个横坐标属性 i、一个列坐标属性 j 和一个方向属性 di,表示其下一点的位置。如果约定尝试的顺序为上、右、下、左(即顺时针方向) ,则每尝试一个方向不通时,di 值增 1,当 d 增至 4 时,表示此位置一定不是通路上的点,从栈中去除。在找到出口时,栈中保存的就是一条迷宫通路。(1)下面介绍求解迷宫(xi,yj)到终点(xe,ye)的路径的函数

5、:先将入口进栈(其初始位置设置为1) ,在栈不空时循环取栈顶方块(不退栈)若该方块为出口,输出所有的方块即为路径,其代码和相应解释如下:int mgpath(int xi,int yi,int xe,int ye) /求解路径为:(xi,yi)-(xe,ye)struct int i; /当前方块的行号int j; /当前方块的列号int di; /di 是下一可走方位的方位号 stMaxSize; /定义栈int top=-1; /初始化栈指针int i,j,k,di,find;top+; /初始方块进栈sttop.i=xi;sttop.j=yi;sttop.di=-1;mg11=-1; w

6、hile (top-1) /栈不空时循环i=sttop.i;j=sttop.j;di=sttop.di; /取栈顶方块if (i=xe for (k=0;ktop=-1)/M*N 迷宫的大小typedef struct /定义栈元素的类型int x,y,dir;elemtype;typedef struct / 定义顺序栈elemtype stack maxlen;int top;sqstktp;struct moved/定义方向位移数组的元素类型对于存储坐标增量的方向位移数组 move int dx,dy;/void inimaze(int mazeN2)/初始化迷宫int i,j,num;

7、for(i=0,j=0;itop=-1; /*inistack*/int push(sqstktp*s,elemtype x)if(s-top=maxlen-1)return(false);elses-stack+s-top=x;/*栈不满,执行入栈操作*/return(true);/*push*/elemtype pop(sqstktp *s)/*栈顶元素出栈*/elemtype elem;if(s-toptop-;return(s-stacks-top+1); /栈不空,返回栈顶元素 /pop/void path(int mazeN2,struct moved move,sqstktp *

8、s) /寻找迷宫中的一条通路int i,j,dir,x,y,f;elemtype elem;i=1;j=1;dir=0;maze11=-1; /设11 为入口处do x=i+movedir.dx;/球下一步可行的到达点的坐标y=j+movedir.dy;if(mazexy=0)elem.x=i;elem.y=j;elem.dir=dir;f=push(s,elem);/如果可行将数据入栈if(f=false)/如果返回假,说明栈容量不足couttop=-1) /循环if(s-top=-1)/若是入口,则无通路couttop)coutstacki.xstacki.ytop)cout“;if(i+

9、1)%4=0)couttop-1) /根据栈中元素的坐标,将通路的各个点的值改为 8elem=pop(s);i=elem.x;j=elem.y;mazeij=8;for(i=1;i=M;i+)for(j=1;j=N;j+)printf(“%3d“,mazeij); /显示已标记通路的迷宫coutendl;void main() /寻找迷宫通路程序sqstktp *s;int mazeM2N2;struct moved move8;inimaze(maze); /初始化迷宫数组s=(sqstktp *)malloc(sizeof(sqstktp);inistack(s); /初始化栈inimove(move); /初始化方向位移数组path(maze,move,s); /寻找迷宫通路coutendl;draw(maze,s); /绘制作出通路标记的迷宫5.运行结果收获 : 这次试验总体来说还是比较简单的,因为几个思考问题都是在基本问题的源代码上进行改进和补充。有了第一次数据结构编程和测试的经验,这次试验减少了很多困难,相对来说容易多了。这次实验让我对栈和队列有了更好的理解和运用。教师评分:教师签字:

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

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

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


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

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

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