收藏 分享(赏)

数据结构课程设计报告-迷宫求解(递归与非递归).doc

上传人:精品资料 文档编号:10803125 上传时间:2020-01-10 格式:DOC 页数:10 大小:92KB
下载 相关 举报
数据结构课程设计报告-迷宫求解(递归与非递归).doc_第1页
第1页 / 共10页
数据结构课程设计报告-迷宫求解(递归与非递归).doc_第2页
第2页 / 共10页
数据结构课程设计报告-迷宫求解(递归与非递归).doc_第3页
第3页 / 共10页
数据结构课程设计报告-迷宫求解(递归与非递归).doc_第4页
第4页 / 共10页
数据结构课程设计报告-迷宫求解(递归与非递归).doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、数据结构课程设计迷宫求解班级: 学号: 姓名: 指导老师: 迷宫求解1、 问题描述输 入 一 个 任 意 大 小 的 迷 宫 数 据 ,用 递 归 和 非 递 归 两 种 方 法求 出 一 条 走 出 迷 宫 的 路 径 ,并 将 路 径 输 出 。2、 设计思路从入口出发,按某一方向向前探索,若能走通并且未走过,即某处可以到达,则到达新点,否则试探下一个方向;若所有的方向均没有通路,则沿原路返回前一点,换下一个方向再继续试探,直到找到一条通路,或无路可走又返回入口点。在求解过程中,为了保证在到达某一点后不能向前继续行走(无路)时,能正确返回前一点以便继续从下一个方向向前试探,则需要用一个栈(

2、递归不需要)保存所能够到达的每一点的下标及从该点前进的方向。设迷 宫为 m 行 n 列,利用 mazemn来表示一个迷宫,mazeij=0 或 1;其中:0 表示通路,1 表示不通,当从某点向下试探时,中间点有四个方向可以试探,而四个角点有两个方向,其他边缘点有三个方向,为使 问题简单化,用 mazem+2n+2来表示迷宫,而迷宫的四周的值全部为 1,这样做使问题简单了,每个点的试探方向全部为 4,不用再判断当前点的试探方向有几个。3、 数据结构设计在上述表示迷宫的情况下,每个点有 4 个方向去试探,如当前点的坐标(x,y),与其相邻 的 4 个点的坐标都可根据与该点的相邻方位而得到。因为 出

3、口在(m,n),因此 试探顺序规定为:从当前位置向前试探的方向为从正东沿顺时针方向进行。为了简化问题,方便求出新点的坐标,将从正东开始沿顺时针进行的 4 个方向的坐标增量放在一个结构数组 move4中,在 move 数组中,每个元素有两个域 组成,x 为横坐标增量,y 为纵坐标增量。这样对 move 设计会很方便地求出从某点(x,y)按某一方向 v(0#include#define MAXSIZE 100#define m 3 #define n 3 /*定义迷宫的行数和列数,可更改*/typedef structint x,y;item;item move4; /*路线移动的方向坐标*/ty

4、pedef structint x,y,d;Datatype; /*横纵坐标及方向*/typedef structDatatype dataMAXSIZE;int top;SeqStack,*PSeqStack; /*定义栈*/PSeqStack Init_SeqStack(void) /*初始化栈*/PSeqStack S;S=(PSeqStack)malloc(sizeof(SeqStack);if(S)S-top=-1;return S;int Empty_SeqStack(PSeqStack S) /*判栈空*/if(S-top=-1)return 1;elsereturn 0;int

5、 Push_SeqStack(PSeqStack S,Datatype x) /*入栈*/if(S-top=MAXSIZE-1)return 0;elseS-top+;S-dataS-top=x;return 1;int Pop_SeqStack(PSeqStack S,Datatype *x) /*出栈*/if(Empty_SeqStack(S)return 0;else*x=S-dataS-top;S-top-;return 1;void Destroy_SeqStack(PSeqStack *S) /*毁栈*/if(*S)free(*S);*S=NULL;return;int mazep

6、ath(int mazen+2,item move4,int x0,int y0) /*迷宫功能实现函数*/*求迷宫路径,入口参数:迷宫数组,下标移动的增量数组,开始点(x0,y0) ,0(m,n)是终点,返回值:1 表示求出路径,0 表示无路径*/PSeqStack S;Datatype temp;int x,y,d,i,j;temp.x=x0;temp.y=y0;temp.d=-1;S=Init_SeqStack(); /*初始化栈*/if(!S)printf(“栈初始化失败“);return 0;Push_SeqStack(S,temp);while(!Empty_SeqStack(S)

7、Pop_SeqStack(S,x=temp.x;y=temp.y;d=temp.d+1;while(d#include#define m 3#define n 3typedef structint x,y;item;item move4;int path(int mazen+2,item move,int x,int y,int step)/*求迷宫路径,入口参数:迷宫数组,下标移动的增量数组,开始点(x,y) ,以及开始点对应的步数 step, (m,n)是终点,返回值:1 表示求出路径,0 表示无路径*/int i;step+;mazexy=step;if(x=m /*起始位置是出口,找到

8、路径,结束*/for(i=0;i4;i+)if(mazex+movei.xy+movei.y=0)if(path(maze,move,x+movei.x,y+movei.y,step)return 1; /*下一个是出口,则返回*/step-;mazexy=0;return 0;void main()item move4;int mazem+2n+2;int i,j;for(i=0;im+2;i+)for(j=0;jn+2;j+)scanf(“%d“,printf(“n“);move0.x=1;move0.y=0;move1.x=0;move1.y=1;move2.x=-1;move2.y=0

9、;move3.x=0;move3.y=-1;if(path(maze,move,1,1,1)for(i=0;im+2;i+)for(j=0;jn+2;j+)printf(“%d “,mazeij);printf(“n“); /*输出有路迷宫的路线*/else printf(“迷宫无路径n”);getch();6、 运行与测试迷宫栈(无路径):有路径:迷宫递归(无路径):有路径:7、 设计心得迷宫这个问题也是老师经常讲的例子,是加深对栈运用的好程序。这个程序又加了个递归的算法,相同的程序不同的算法。我结合老师提过的思想与教材上的例子,很顺利的完成了这个程序。其实在写完这个程序后,我又想到了马的遍历,这两个程序的设计思想极其相似,所以我很快又写出马的遍历栈与递归的算法,并且运行成功。至此,三个题目设计都完成了,每次上机都会遇到题目,这次也不例外,经过 我的不懈努力,解决了部分, 还有的现在不能解决,只能留着日后思考和解决了,例如简化代码,可视化调试。这次的程序设计也让我意识到,在编写之前,做整体的规划很重要,这才能让我们的编写效率更高。

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

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

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


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

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

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