数据结构课程设计迷宫求解.docx
《数据结构课程设计迷宫求解.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计迷宫求解.docx(21页珍藏版)》请在三一办公上搜索。
1、迷宫求解一问题描述对迷宫问题的求解过程实际就是从入口开始,一步一步地走到出 口的过程。 基本要求:输入一个任意大小的迷宫数据,用递归和非递归两种方法求出 一条走出迷宫的路径,并将路径输出。二设计思路在本程序中用两种方法求解迷宫问题 - 非递归算法和递归算法。 对于非递归算法采用回溯的思想,即从入口出发,按某一方向向 前探索,若能走通,并且未走过,则说明某处可以到达,即能到达新 点,否则试探下一方向;若所有的方向均没有通路,或无路可走又返 回到入口点。在求解过程中, 为了保证在到达某一点后不能向前继续 行走(无路)时,能正确返回前一点以便继续从下一个方向向前试探, 则需要用一个栈保存所能到达的没
2、一点的下标及该点前进的方向, 然 后通过对各个点的进出栈操作来求得迷宫通路。对于递归算法,在当前位置按照一定的策略寻找下个位置,在下 个位置又按照相同的策略寻找下下个位置; 直到当前位置就是出口 点,每一步的走法都是这样的。随着一步一步的移动,求解的规模不 断减小;如果起始位置是出口,说明路径找到,算法结束,如果起始 位置的四个方向都走不通,说明迷宫没有路径,算法也结束。另外,为了保证迷宫的每个点都有四个方向可以试探,简化求解过程,将迷宫四周的值全部设为 1,因此将 m行 n 列的迷宫扩建为 m+2行, n+2列,同时用数组来保存迷宫阵列。 三数据结构设计在迷宫阵列中每个点都有四个方向可以试探
3、,假设当前点的坐 标( x,y),与其相邻的四个点的坐标都可根据该点的相邻方位 而得到,为了简化问题,方便求出新点的坐标,将从正东开始沿 顺时针进行的这四个方向的坐标增量放在一个结构数组 move4 中,每个元素有两个域组成,其中 x 为横坐标增量, y 为纵坐标增 量,定义如下:typedef structint x,y;item;为到达了某点而无路可走时需返回前一点,再从前一点开始向下 一个方向继续试探。因此,还要将从前一点到本点的方向压入栈中。 栈中的元素由行、列、方向组成,定义如下: typedef structint x,y,d;DataType;由于在非递归算法求解迷宫的过程中用到
4、栈,所以需定义栈的类 型,本程序中用的是顺序栈,类型定义如下 ;typedef structDataType dataMAXSIZE;int top;SeqStack, *PSeqStack;四功能函数设计( 1)函数 PSeqStack Init_SeqStack() 此函数实现对栈的初始化工作。( 2)函数 Empty_SeqStack(PSeqStack S) 此函数用于判断栈是否为空。( 3)函数 Push_SeqStack (PSeqStack S, DataType x) 此函数实现入栈操作。( 4)函数 Pop_SeqStack(PSeqStack S ,DataType *x)
5、 此函数实现出栈操作。( 5)函数 Destory_Seqstack(PSeqStack *S) 此函数执行栈的销毁操作,释放内存空间。( 6)函数 mazepath(int mazen+2,item move,int x0,int y0) 此函数实现对迷宫问题的非递归算法求解。在求解过程中需调 用上面定义的关于栈的一系列函数 (栈的初始化, 判空,入栈,出栈, 栈的销毁),进而求得迷宫路径。( 7)函数 path(int mazen+2,item move,int x,int y,intstep) 此函数实现对迷宫问题的递归算法求解。( 8)函数 print_way(int mazen+2,
6、item move) 此函数用于在递归算法求解迷宫后输出求解后的结果, 即打印迷 宫路径。( 9)函数 copy(int mazen+2,int msn+2)此函数的作用是复制一下输入的原始迷宫序列,因为本程序是通 过菜单选择求解迷宫的实现方式, 将非递归算法和递归算法放在一起 通过菜单选择实现, 在调用完一种算法后, 为保证调用另一种算法时 原始迷宫序列未改变,所以需调用此函数来原始迷宫序列备份一下。 ( 10)主函数 main()定义变量,实现迷宫的输入操作,通过菜单选择求解迷宫路径的 实现方法,调用相关函数。(11)系统功能总体模块(a)栈的初始化b)判栈空函数c)入栈d)出栈e)销毁栈
7、f )非递归算法求解迷宫函数g)递归算法求解迷宫函数h)打印递归算法求解迷宫的路径函数i ) 复制原始迷宫阵列函数報国州()五编码实现#include#include#define m 6#define n 8#define MAXSIZE 100typedef structint x,y;item;item move4;typedef structint x,y,d;DataType;typedef structDataType dataMAXSIZE;int top;SeqStack, *PSeqStack;PSeqStack Init_SeqStack()/ 栈的初始化PSeqStack
8、 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 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)/出栈
9、if (Empty_SeqStack ( S ) )return 0; /栈空不能出栈else *x=S-dataS-top; S-top-; return 1;void Destory_Seqstack(PSeqStack *S) /销毁栈if(*S) free(*S);*S=NULL;return;int mazepath(int mazen+2,item move,int x0,int y0) /非递归算法求解迷宫 PSeqStack S;DataType temp;int x,y,d,i,j;temp.x=x0;temp.y=y0;temp.d=-1;S=Init_SeqStack()
10、;if(!S)printf( 栈初始化失败! );return (0);Push_SeqStack (S, temp); while(!Empty_SeqStack(S) Pop_SeqStack(S ,&temp); x=temp.x; y=temp.y;d=temp.d+1;while(d4)i=x+moved.x;j=y+moved.y;if(mazeij=0)temp.x=x;temp.y=y;temp.d=d;Push_SeqStack (S, temp);x=i;y=j;mazexy=-1;if(x=m&y=n)printf(n 非递归算法求解的迷宫路径为 (顺序为从出口到入 口输
11、出):n);while(!Empty_SeqStack(S)Pop_SeqStack(S,&temp);printf(%d %d) - ,temp.x,temp.y);printf(nnn);Destory_Seqstack(&S);return 1;elsed=0;elsed+;Destory_Seqstack(&S);return 0;int path(int mazen+2,item move,int x,int y,int step) /递归算法求解迷宫 int i;step+; mazexy=step;if(x=m&y=n)return 1;for(i=0;i4;i+) if(maz
12、ex+movei.xy+movei.y=0) if(path(maze,move,x+movei.x,y+movei.y,step) return 1;step-;mazexy=0;return 0;void print_way(int mazen+2,item move) / 打印递归算法求解迷宫的路径 int i,j;if(path(maze,move,1,1,1)printf(n 找到路径的矩阵形式输出如下: n);for(i=0;im+2;i+)for(j=0;jn+2;j+) printf(%d ,mazeij);printf(n);printf(n);printf( 递归算法求解的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 迷宫 求解
链接地址:https://www.31ppt.com/p-4281781.html