版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、迷宫求解一问题描述对迷宫问题的求解过程实际就是从入口开始,一步一步地走到出口的过程。基本要求:输入一个任意大小的迷宫数据,用递归和非递归两种方法求出一条走出迷宫的路径,并将路径输出。二设计思路在本程序中用两种方法求解迷宫问题- 非递归算法和递归算法。对于非递归算法采用回溯的思想,即从入口出发,按某一方向向前探索,若能走通,并且未走过,则说明某处可以到达,即能到达新点,否则试探下一方向;若所有的方向均没有通路,或无路可走又返回到入口点。在求解过程中,为了保证在到达某一点后不能向前继续行走 (无路) 时, 能正确返回前一点以便继续从下一个方向向前试探,则需要用一个栈保存所能到达的没一点的下标及该点
2、前进的方向,然后通过对各个点的进出栈操作来求得迷宫通路。对于递归算法,在当前位置按照一定的策略寻找下个位置,在下个位置又按照相同的策略寻找下下个位置一;直到当前位置就是出口点,每一步的走法都是这样的。随着一步一步的移动,求解的规模不断减小;如果起始位置是出口,说明路径找到,算法结束,如果起始位置的四个方向都走不通,说明迷宫没有路径,算法也结束。另外,为了保证迷宫的每个点都有四个方向可以试探,简化求解过程,将迷宫四周的值全部设为1,因此将m行n列的迷宫扩建为m+2 行,n+2列,同时用数组来保存迷宫阵列。三数据结构设计在迷宫阵列中每个点都有四个方向可以试探,假设当前点的坐标(x, y),与其相邻
3、的四个点的坐标都可根据该点的相邻方位而得到,为了简化问题,方便求出新点的坐标,将从正东开始沿顺时针进行的这四个方向的坐标增量放在一个结构数组move4中,每个元素有两个域组成,其中x 为横坐标增量,y 为纵坐标增量,定义如下:typedef structint x,y;item;为到达了某点而无路可走时需返回前一点,再从前一点开始向下一个方向继续试探。因此,还要将从前一点到本点的方向压入栈中。栈中的元素由行、列、方向组成,定义如下:typedef structint x,y,d;DataType;由于在非递归算法求解迷宫的过程中用到栈,所以需定义栈的类型,本程序中用的是顺序栈,类型定义如下;t
4、ypedef structDataType dataMAXSIZE;int top;SeqStack, *PSeqStack;四功能函数设计(1)函数PSeqStack Init_SeqStack()此函数实现对栈的初始化工作。(2)函数Empty_SeqStack(PSeqStackS)此函数用于判断栈是否为空。(3)函数Push_SeqStack (PSeqStackS, DataTypex)此函数实现入栈操作。( 4)函数Pop_SeqStack(PSeqStack S ,DataType *x)此函数实现出栈操作。( 5)函数Destory_Seqstack(PSeqStack *S)
5、此函数执行栈的销毁操作,释放内存空间。( 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,item move)此函数用于在递归算法求解迷宫后输出求解后的结果,即打印迷宫路径。( 9)函数copy(int
6、 mazen+2,int msn+2)此函数的作用是复制一下输入的原始迷宫序列,因为本程序是通 过菜单选择求解迷宫的实现方式,将非递归算法和递归算法放在一起 通过菜单选择实现,在调用完一种算法后,为保证调用另一种算法时 原始迷宫序列未改变,所以需调用此函数来原始迷宫序列备份一下。(10)主函数 main()定义变量,实现迷宫的输入操作,通过菜单选择求解迷宫路径的实现方法,调用相关函数。(11)系统功能总体模块21 / 21(d)出栈(e)销毁栈(f)非递归算法求解迷宫函数pr储明"梅始化人Irehi rrt(OLPuiihSrqSi ackje.,lultlplrxMkiltipUk
7、(g)递归算法求解迷宫函数(h)打印递归算法求解迷宫的路径函数fa4J«prmrt!廉到舒件的工.叩”中无法找到路。priti 出Mulfiipk(i )复制原始迷宫阵列函数(j)主函数JlMuliipki五编码实现#include<stdio.h>#include<stdlib.h>#define m 6#define n 8#define MAXSIZE 100typedef struct int x,y;item;item move4;typedef struct int x,y,d;DataType; typedef structDataType da
8、taMAXSIZE;int top;SeqStack, *PSeqStack;PSeqStack Init_SeqStack()/栈的初始化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 Push_SeqStack (PSeqStack S, DataType x)/入栈if (S->top=MAXSIZE-1)return 0;
9、 /栈满不能入栈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 Destory_Seqstack(PSeqStack *S)/销毁栈if(*S)free(*S);*S=NULL;return;int mazepath(int mazen+2,item move,int x0,
10、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(" 栈初始化失败!");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(d<4)i=x+moved.x;j=y+moved.y;if(mazei
11、j=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");while(!Empty_SeqStack(S)Pop_SeqStack(S,&temp);printf("(%d %d) <- ",temp.x,temp.y);printf("nnn");Destory_Seqstack(&S);return
12、 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;i<4;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_
13、way(int mazen+2,item move) /打印递归算法求解迷宫的路径int i,j;if(path(maze,move,1,1,1)printf("n 找到路径的矩阵形式输出如下:n");for(i=0;i<m+2;i+)for(j=0;j<n+2;j+)printf("%d ",mazeij);printf("n");printf("n");printf(" 递归算法求解的迷宫路径为(顺序为从入口到出口输出): n");for(i=0;i<m+2;i+)for(
14、j=0;j<n+2;j+)if(mazeij>1)printf("(%d %d) -> ",i,j); printf("nnn");elseprintf(" 无法找到路径!n");void copy(int mazen+2,int msn+2)/复制原始迷宫序列函数for(int i=0;i<m+2;i+)for(int j=0;j<n+2;j+) msij=mazeij;void main()int mazem+2n+2;item move4;int i,j,Q;printf(" 请输入迷宫序
15、列:n");for(i=0;i<m+2;i+)for(j=0;j<n+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(&
16、quot;1. 非递归形式走迷宫n");printf("2. 递归形式走迷宫n");printf("3. 退出 n");printf("*n");求解方式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);II);六.运行与测试,白学W'ZHSS
17、ftLh槌麴构课程设计上机15.中屋小0之0一1 10 16 00 1116 01 011Q &1 01Q 00 1 11 11 11 J0 J10 (1 (1 JWSF,靛y举达择时退出):1柞递归算法求解的迷宫路径为(顺序为从出口至I人口输出)呼野野野皆里苧?、后的迷瓦路径为(,服序情选择选择退出-0Press amy ketj to continue七.总结在这个课程设计中,遇到的主要问题是选择了一种实现方法后,在选择另一种时不会输出结果,但是当我把这两个程序分开调试时都会出现结果,结果还是正确的,后来经过分析知道原来是调用完一种方法后,原来输入的迷宫序列可能被改变了,因此,又增
18、加了一个复制原始迷宫序列的函数,对原始序列进行了保存,然后在调用时就出现结果了。通过调试这个程序,熟悉了迷宫的两种求法,在调试找错过程中也学会好多。构造 n 个城市连接的最小生成树一问题描述一个地区的n 个城市间的距离网,用Prim 算法建立最小生成树,并计算得到的最小生成树的代价。基本要求:1) 城市间的距离网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。要求在屏幕上显示得到的最小生成树中包括了哪些城市间的道路,并显示得到的最小生成树的代价。2) 表示城市间距离网的邻接矩阵( 要求至少6 个城市,10 条边 )
19、二设计思路在本程序中,各个地区之间的距离网可以用邻接矩阵表示,在进行定义时表示出相应的权值,以便计算最小代价,当权值赋为999时, 表示两城市之间无路径。然后用 Prim 算法建立最小生成树,进而在建立过程中可以计算得到的最小生成树的代价。三数据结构设计首先,在用邻接矩阵存储图时,除了用一个二维数组存储用于表示顶点间相邻关系的邻接矩阵外,还需要用一个一维数组来存储顶点信息,另外,还有图的顶点数和边数。故可将其形式描述如下:typedef structchar vertexsMaxVertexNum;int arcsMaxVertexNumMaxVertexNum;int vertexNum,e
20、dgeNum;MGraph;为实现普利姆算法求最小生成树,需设置一个辅助数组Closedge,里面存放一顶点为与已构造好的部分生成树的顶点间权值最小的顶点, 边为某顶点与已构造好的部分生成树的顶点间的最小权值。定义形式如下:typedef structint adjvertex;int lowcost;ClosEdgeMaxVertexNum;四功能函数设计( 1)函数CreatGraph(MGraph *G)此函数用于创建邻接矩阵,用邻接矩阵来存储图,建立各个城市之间的关系。在建立过程中,给相应的边赋权值,以表示两城市之间的代价。注:999 代表两城市之间无路径。( 2) 函数 MiniSp
21、anTree_PRIM(MGraph*G,int u,ClosEdge closedge)此函数为普利姆函数,用于求最小生成树,在此过程中求出相应 的权值,及最小生成树权值之和,用于表示连接各城市之间的最小代 价。(3)主函数 main ()定义变量,分别调用相应的函数。(4)系统功能总体模块(a)创建邻接矩阵CreatGraph(MGraph *G)的流程图如下:i广仆Mvhiplci SMalflplciu,ClosEdge closedge)流程图如下:22 / 21(b)构建最小生成树普利姆函数 MiniSpanTree_PRIM(MGraph*G,int27 / 21(c)主函数ma
22、in()流程图如下:五.编码实现#include<stdio.h>#include<stdlib.h>#define MaxVertexNum 30#define INFINITY 3000typedef structchar vertexsMaxVertexNum;int arcsMaxVertexNumMaxVertexNum;int vertexNum,edgeNum;MGraph;typedef struct int adjvertex;int lowcost;ClosEdgeMaxVertexNum;void CreatGraph(MGraph *G) int
23、 i,j,k,n;printf(" 请输入顶点数和边数:");scanf("%d %d",&(G->vertexNum),&(G->edgeNum);printf("n");for(i=0;i<G->vertexNum;i+) printf(" 请输入第%d 个顶点字符信息(共 %d 个 ): ",i+1,G->vertexNum);scanf("%c",&(G->vertexsi);getchar();for(i=0;i<G-&
24、gt;vertexNum;i+)for(j=0;j<G->vertexNum;j+)if(i=j)G->arcsij=0;elseG->arcsij=999;for(k=0;k<(G->edgeNum);k+)printf("n");printf(" 请输入边<Vi,Vj> 对应的顶点序号(共 %d 个 ): ",G->edgeNum);scanf("%d %d",&i,&j);printf(" 请输入此边的权值:");scanf("%
25、d",&n);G->arcsij=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;i<G->vertexNum;i+)if(i!=u)closedgei.adjvertex=u;closedgei.lowcost=G->arcsui;close
26、dgeu.lowcost=0;for(i=0;i<G->vertexNum-1;i+)w=INFINITY;for(j=0;j<G->vertexNum;j+)if(closedgej.lowcost!=0 && closedgej.lowcost<w)w=closedgej.lowcost;k=j;closedgek.lowcost=0;for(j=0;j<G->vertexNum;j+) if(G->arcskj<closedgej.lowcost) closedgej.adjvertex=k;closedgej.low
27、cost=G->arcskj;for(i=0;i<G->vertexNum;i+)if(i!=u)printf(" 输出构建的最小生成树为:");printf("%d->%d,%dn",i,closedgei.adjvertex,G->arcsiclosedgei.adjvertex); count+=G->arcsiclosedgei.adjvertex;printf("n");printf(" 此最小生成树的代价为:%d",count);printf("n"
28、;);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");六.运行与测试,通学乐CXSmSSLt机时"' L7 7 7 7 7 7 77 7 7 7 7 7 7 共共共共共共共 (c c c c c C
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 财务部年度工作总结及计划模板
- 2024年出纳工作总结与计划范文
- 中学春季期教学教研工作计划
- 2024年秋季学生资助工作计划要点
- 院办某年工作计划
- 2024家长学校工作计划模板
- 三年级学困生转化记录三年级学困生转化计划范文
- 六年级下册信息技术课堂教学计划
- 月工作计划集锦
- 月工作计划范文集合
- 债权债务抵消协议-合同模板
- 【MOOC】电工学-西北工业大学 中国大学慕课MOOC答案
- 第九版内科学糖尿病
- 2024年6月第2套英语六级真题
- 护理责任组长年终总结
- 2024年人教版初二地理上册期末考试卷(附答案)
- 自然科学如何撰写和发表高水平的科研论文
- 太阳系中的有趣科学学习通超星期末考试答案章节答案2024年
- 食品安全管理制度进货查验
- 2024《鱼塘承包流转合同》鱼塘承包流转合同
- 劳动关系协调员测试题及答案
评论
0/150
提交评论