ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:276.43KB ,
资源ID:4109793      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4109793.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构课程设计迷宫求解.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构课程设计迷宫求解.docx

1、数据结构课程设计迷宫求解迷宫求解一问题描述 对迷宫问题的求解过程实际就是从入口开始,一步一步地走到出口的过程。基本要求: 输入一个任意大小的迷宫数据,用递归和非递归两种方法求出一条走出迷宫的路径,并将路径输出。二设计思路在本程序中用两种方法求解迷宫问题-非递归算法和递归算法。对于非递归算法采用回溯的思想,即从入口出发,按某一方向向前探索,若能走通,并且未走过,则说明某处可以到达,即能到达新点,否则试探下一方向;若所有的方向均没有通路,或无路可走又返回到入口点。在求解过程中,为了保证在到达某一点后不能向前继续行走(无路)时,能正确返回前一点以便继续从下一个方向向前试探,则需要用一个栈保存所能到达

2、的没一点的下标及该点前进的方向,然后通过对各个点的进出栈操作来求得迷宫通路。对于递归算法,在当前位置按照一定的策略寻找下个位置,在下个位置又按照相同的策略寻找下下个位置;直到当前位置就是出口点,每一步的走法都是这样的。随着一步一步的移动,求解的规模不断减小;如果起始位置是出口,说明路径找到,算法结束,如果起始位置的四个方向都走不通,说明迷宫没有路径,算法也结束。另外,为了保证迷宫的每个点都有四个方向可以试探,简化求解过程,将迷宫四周的值全部设为1,因此将m行n列的迷宫扩建为m+2行,n+2列,同时用数组来保存迷宫阵列。三数据结构设计在迷宫阵列中每个点都有四个方向可以试探,假设当前点的坐标(x,

3、y),与其相邻的四个点的坐标都可根据该点的相邻方位而得到,为了简化问题,方便求出新点的坐标,将从正东开始沿顺时针进行的这四个方向的坐标增量放在一个结构数组move4中,每个元素有两个域组成,其中x为横坐标增量,y为纵坐标增量,定义如下:typedef struct int x,y;item;为到达了某点而无路可走时需返回前一点,再从前一点开始向下一个方向继续试探。因此,还要将从前一点到本点的方向压入栈中。栈中的元素由行、列、方向组成,定义如下:typedef struct int x,y,d;DataType; 由于在非递归算法求解迷宫的过程中用到栈,所以需定义栈的类型,本程序中用的是顺序栈,

4、类型定义如下;typedef struct DataType 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)函数Destory_Seqstac

5、k(PSeqStack *S) 此函数执行栈的销毁操作,释放内存空间。(6)函数mazepath(int mazen+2,item move,int x0,int y0) 此函数实现对迷宫问题的非递归算法求解。在求解过程中需调用上面定义的关于栈的一系列函数(栈的初始化,判空,入栈,出栈,栈的销毁),进而求得迷宫路径。(7)函数path(int mazen+2,item move,int x,int y,int step)此函数实现对迷宫问题的递归算法求解。(8)函数print_way(int mazen+2,item move)此函数用于在递归算法求解迷宫后输出求解后的结果,即打印迷宫路径。(

6、9)函数copy(int mazen+2,int msn+2) 此函数的作用是复制一下输入的原始迷宫序列,因为本程序是通过菜单选择求解迷宫的实现方式,将非递归算法和递归算法放在一起通过菜单选择实现,在调用完一种算法后,为保证调用另一种算法时原始迷宫序列未改变,所以需调用此函数来原始迷宫序列备份一下。(10)主函数main() 定义变量,实现迷宫的输入操作,通过菜单选择求解迷宫路径的实现方法,调用相关函数。(11)系统功能总体模块(a)栈的初始化(b)判栈空函数(c)入栈(d)出栈(e)销毁栈(f)非递归算法求解迷宫函数(g)递归算法求解迷宫函数(h)打印递归算法求解迷宫的路径函数(i) 复制原

7、始迷宫阵列函数(j)主函数五编码实现#include#include#define m 6#define n 8#define MAXSIZE 100typedef struct int x,y;item;item move4;typedef struct int x,y,d;DataType;typedef struct DataType dataMAXSIZE; int top;SeqStack, *PSeqStack;PSeqStack Init_SeqStack() /栈的初始化 PSeqStack S; S=(PSeqStack)malloc(sizeof(SeqStack); if

8、 (S) S-top=-1; return S;int Empty_SeqStack(PSeqStack S) /判栈空 if (S-top=-1) return 1; else return 0;int Push_SeqStack (PSeqStack S, DataType x) /入栈 if (S-top=MAXSIZE-1) return 0; /栈满不能入栈 else S-top+; S-dataS-top=x; return 1; int Pop_SeqStack(PSeqStack S ,DataType *x) /出栈 if (Empty_SeqStack ( S ) ) re

9、turn 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(); if(!S) printf(栈

10、初始化失败!); 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非递归算法求解的迷宫路径为(顺序为从出口到入口输出):n

11、); while(!Empty_SeqStack(S) Pop_SeqStack(S,&temp); printf(%d %d) - ,temp.x,temp.y); printf(nn.n); Destory_Seqstack(&S); return 1; else d=0; else d+; 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

12、;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 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); print

13、f(n); printf(递归算法求解的迷宫路径为(顺序为从入口到出口输出):n); for(i=0;im+2;i+) for(j=0;j1) printf(%d %d) - ,i,j); printf(nn.n); else printf(无法找到路径!n);void copy(int mazen+2,int msn+2) /复制原始迷宫序列函数 for(int i=0;im+2;i+) for(int j=0;jn+2;j+) msij=mazeij; void main() int mazem+2n+2; item move4; int i,j,Q; printf(请输入迷宫序列:n);

14、 for(i=0;im+2;i+) for(j=0;jn+2;j+) scanf(%d,&mazeij); printf(n); move0.x=0;move0.y=1; move1.x=1;move1.y=0; move2.x=0;move2.y=-1; move3.x=-1;move3.y=0; printf(n); int mase1m+2n+2; copy(maze,mase1); printf(*走迷宫*n); printf(n); printf(1. 非递归形式走迷宫n); printf(2. 递归形式走迷宫n); printf(3. 退出n); printf(*求解方式*n);

15、while(1) printf(n请选择(选择0退出):); scanf(%d,&Q); switch(Q) case 1: mazepath(maze,move,1,1); break; case 2: print_way(mase1,move); break; case 0: exit(0); 六运行与测试七总结在这个课程设计中,遇到的主要问题是选择了一种实现方法后,在选择另一种时不会输出结果,但是当我把这两个程序分开调试时都会出现结果,结果还是正确的,后来经过分析知道原来是调用完一种方法后,原来输入的迷宫序列可能被改变了,因此,又增加了一个复制原始迷宫序列的函数,对原始序列进行了保存,然

16、后在调用时就出现结果了。通过调试这个程序,熟悉了迷宫的两种求法,在调试找错过程中也学会好多。构造n个城市连接的最小生成树一问题描述一个地区的n个城市间的距离网,用Prim算法建立最小生成树,并计算得到的最小生成树的代价。基本要求:1) 城市间的距离网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。要求在屏幕上显示得到的最小生成树中包括了哪些城市间的道路,并显示得到的最小生成树的代价。2)表示城市间距离网的邻接矩阵(要求至少6个城市,10条边)二设计思路在本程序中,各个地区之间的距离网可以用邻接矩阵表示,在进行定义时

17、表示出相应的权值,以便计算最小代价,当权值赋为999时,表示两城市之间无路径。然后用Prim算法建立最小生成树,进而在建立过程中可以计算得到的最小生成树的代价。三数据结构设计首先,在用邻接矩阵存储图时,除了用一个二维数组存储用于表示顶点间相邻关系的邻接矩阵外,还需要用一个一维数组来存储顶点信息,另外,还有图的顶点数和边数。故可将其形式描述如下:typedef struct char vertexsMaxVertexNum; int arcsMaxVertexNumMaxVertexNum; int vertexNum,edgeNum;MGraph;为实现普利姆算法求最小生成树,需设置一个辅助数

18、组Closedge,里面存放一顶点为与已构造好的部分生成树的顶点间权值最小的顶点,边为某顶点与已构造好的部分生成树的顶点间的最小权值。定义形式如下:typedef struct int adjvertex; int lowcost;ClosEdgeMaxVertexNum;四功能函数设计(1)函数CreatGraph(MGraph *G)此函数用于创建邻接矩阵,用邻接矩阵来存储图,建立各个城市之间的关系。在建立过程中,给相应的边赋权值,以表示两城市之间的代价。注: 999代表两城市之间无路径。(2)函数MiniSpanTree_PRIM(MGraph *G,int u,ClosEdge clo

19、sedge)此函数为普利姆函数,用于求最小生成树,在此过程中求出相应的权值,及最小生成树权值之和,用于表示连接各城市之间的最小代价。(3)主函数main() 定义变量,分别调用相应的函数。(4)系统功能总体模块(a)创建邻接矩阵CreatGraph(MGraph *G)的流程图如下:(b)构建最小生成树普利姆函数MiniSpanTree_PRIM(MGraph *G,int u,ClosEdge closedge)流程图如下: (c)主函数main()流程图如下:五编码实现#include#include#define MaxVertexNum 30#define INFINITY 3000t

20、ypedef struct char vertexsMaxVertexNum; int arcsMaxVertexNumMaxVertexNum; int vertexNum,edgeNum;MGraph;typedef struct int adjvertex; int lowcost;ClosEdgeMaxVertexNum;void CreatGraph(MGraph *G) int i,j,k,n; printf(请输入顶点数和边数:); scanf(%d %d,&(G-vertexNum),&(G-edgeNum); printf(n); for(i=0;ivertexNum;i+)

21、 printf(请输入第%d个顶点字符信息(共%d个):,i+1,G-vertexNum); scanf(%c,&(G-vertexsi); getchar(); for(i=0;ivertexNum;i+) for(j=0;jvertexNum;j+) if(i=j) G-arcsij=0; else G-arcsij=999; for(k=0;kedgeNum);k+) printf(n); printf(请输入边对应的顶点序号(共%d个):,G-edgeNum); scanf(%d %d,&i,&j); printf(请输入此边的权值:); scanf(%d,&n); G-arcsij=

22、n; G-arcsji=n; printf(n); printf(图已成功创建!n); printf(n);void MiniSpanTree_PRIM(MGraph *G,int u,ClosEdge closedge) int i,j,w,k; int count=0; for(i=0;ivertexNum;i+) if(i!=u) closedgei.adjvertex=u; closedgei.lowcost=G-arcsui; closedgeu.lowcost=0; for(i=0;ivertexNum-1;i+) w=INFINITY; for(j=0;jvertexNum;j+

23、) if(closedgej.lowcost!=0 & closedgej.lowcostw) w=closedgej.lowcost; k=j; closedgek.lowcost=0; for(j=0;jvertexNum;j+) if(G-arcskjarcskj; for(i=0;ivertexNum;i+) if(i!=u) printf(输出构建的最小生成树为:); printf(%d-%d,%dn,i,closedgei.adjvertex,G-arcsiclosedgei.adjvertex); count+=G-arcsiclosedgei.adjvertex; printf

24、(n); printf(此最小生成树的代价为:%d,count); printf(n);void main() MGraph *G; int u; ClosEdge closedge; G=(MGraph*)malloc(sizeof(MGraph); CreatGraph(G); printf(输入构造最小生成树的出发顶点:); scanf(%d,&u); printf(n); MiniSpanTree_PRIM(G,u,closedge); printf(n); 六运行与测试 七总结 本程序相对来说不太难,但在调试过程中也遇到很多错误,其中也包括很多低级错误,还有内存溢出问题,不出现结果问题,通过在猜测出问题的地方加写printf输出提示,然后查找原因,发现了好多问题。最后找到原因,加以改正。通过这次的课程设计,使我加深了对相关知识点的理解掌握,同时在设计调试过程中,也发现了好多的不足之处,对学过的好多知识点都掌握的不够牢固,所以在用起来时经常会出错,还有许多因为粗心带来的问题,虽然在这次课程设计花费了好长时间,但总的来说,收获还是挺大的。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1