数据结构课程设计报告_最短路径C++
C语言迪杰斯特拉实现最短路径算法

数据结构课程设计报告----旅游咨询系统设计目录一、需求分析二、系统分析三、概要设计一、系统划分二、邻接矩阵建立流程图:三、迪杰斯特拉算法流图四、详细设计五、调试分析一、运行结果二、改进设想六、课设总结旅游咨询系统设计一、需求分析在交通网络日益发达的今天,人们出行有很多种方式、路线,而如何选择符合需要的方式路线成为大家的一大难题。
所以,在此我利用计算机建立一个旅游咨询系统。
在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的路线,所带权值为两个城市间的路程、时间或车费等。
这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从A城到B城里程最短;如何选择一条路径使得从A城到B城花费最低;如何选择一条路径使得从A 城到B城所用的时间最少等等的一系列问题。
二、系统分析设计一个旅游咨询系统,能咨询从任何一个城市顶点到其他城市顶点之间的最短路径(里程、最低花费或是最少时间等问题。
对于不同的咨询要求,可输入城市间的路程、所需时间或是所需费用等信息。
旅客可以在同一个系统中综合考虑自己的各目标城市,选择一个最佳的旅游路线和出行方式。
针对最短路径问题,在本系统中采用图的相关知识,采用了迪杰斯特拉算法,解决在实际情况中的最短路径问题,而迪杰斯特拉算法的时间复杂度为O(n2,空间复杂度为O(n。
本系统使用邻接矩阵存储无向图。
其中,建立矩阵的时间复杂度为O(n2,但是利用其查找一条边的时间复杂度为O(1。
本系统中包括了利用邻接矩阵建立图的存储结构和单源最短问题两大部分,使用指针数组实现利用一个程序实现最短路径和最短时间的运算。
并且本系统设置了人性化的系统提示菜单,方便使用者的使用。
三、概要设计一、系统划分该系统可以划分为三个部分:1、利用邻接矩阵建立图的存储结构;2、利用迪杰斯特拉算法解决单源最短路径问题;3、实现城市之间的最短路径问题和最短时间问题。
二、邻接矩阵建立流程图:四、详细设计本课程设计的源程序如下所示:#include#include#define MVNum 100#define Maxint 9999 /*将无穷大的数值设为9999*/ typedef char vertextype;/*建立无向图*/typedef int adjmatrix;typedef struct{vertextype vexs[MVNum];adjmatrix arcs[MVNum][MVNum];}mgraph;mgraph *G[2]; /*设置指针数组用以实现距离和时间最小值求取*/void city_number( /*输出城市代表序号*/{ printf("************************************************************************ *\n";printf(" 1、北京 2、上海 3、香港 4、天津 5、重庆 6、澳门 7、哈尔滨 8、石家庄";printf(" \n 9、兰州 10、昆明 11、成都 12、长春 13、沈阳 14、长沙 15、海口 16、西安";printf("\n************************************************************************ *\n";}void Createmgraph(int a,int n,int e /*建立无向邻接矩阵*/{int i,j,k;int w;for(i=1;i<=n;i++for(j=1;j<=n;j++if(i==j G[a]->arcs[i][j]=0; /*邻接矩阵对角线初始值设为0*/else G[a]->arcs[i][j]=Maxint; /*其他元素设为无穷大*/for(k=1;k<=e;k++ /*读入e条边数的信息*/{printf("\n输入图中各起点终点及其权值i,j,w:"; /*读入无向边及其权值*/scanf("%d,%d,%d",&i,&j,&w;G[a]->arcs[i][j]=w;G[a]->arcs[j][i]=w;}}void Dijkstra(int a,int v0,int N/*Dijkstra算法的实现和打印*/{enum boolean S[MVNum];/*终点集合*/int dist[MVNum],path[MVNum];/*dist表示源点v0到图中其余顶点的最短长度,path表示其对应的路径*/int i,wmin,u,num=1,k;for(i=1;i<=N;i++ /*数组dist和集合S付初值*/{dist[i]=G[a]->arcs[v0][i]; /*数组dist初值为邻接矩阵*/S[i]=0; /*集合S初值设为空集*/if(dist[i]else path[i]=0;}S[v0]=1; /*源点v0放入集合S中*/path[v0]=0;do{wmin=Maxint; /*wmin最小值设为无穷大*/u=v0;for(i=1;i<=N;i++if(S[i]==0 /*选择不在S中且距离最小的顶点u*/if((dist[i]{u=i;wmin=dist[i];}S[u]=1; /*把距离最小的顶点u放入集合S中*/for(i=1;i<=N;i++ /*修改不在S中的顶点距离*/if(S[i]==0if(dist[u]+G[a]->arcs[u][i]{dist[i]=dist[u]+G[a]->arcs[u][i];path[i]=u;}num++;}while(num<=N;printf("\n\t输出带权无向图的单元最短路径为:\n\t";/*打印v0到其他顶点的最短路径*/ for(i=1;i<=N;i++{if(S[i]==1{k=i;printf("\n\t顶点%d到%d之间的路径为:",v0,i;while(k!=v0{printf("%d<--",k; /*输出后继顶点*/k=path[k]; /*继续寻找下一个后继顶点*/}printf("%d",k; /*输出终点*/printf(",最短路径长度为%d\n",dist[i]; /*输出最短路径*/}else printf("\n\t顶点%d到%d之间没有路径!",v0,i;}printf("\n\t求一个城市到所有城市的最短路径结束,谢谢!\n\n\t\t";}void main( /*旅游咨询系统*/{int n,e,v,u,i,x;int z=0;G[1]=(mgraph *malloc(sizeof(mgraph; /*建立类型为mgraph的十字链表结构*/G[2]=(mgraph *malloc(sizeof(mgraph;printf("****************欢迎使用旅游咨询系统****************\n";printf("输入图中顶点个数和边数n,e:";scanf("%d,%d",&n,&e;city_number(;for(i=1;i<=n;i++ /*输入顶点信息*/{printf("\n请输入图的所有顶点i=";scanf("%d",&x;G[1]->vexs[i]=x; /*将顶点信息输入一维数组中*/G[2]->vexs[i]=x;}printf("\n请输入距离矩阵的数值\n";Createmgraph(1,n,e; /*建立距离矩阵*/ printf("\n距离矩阵建立完毕\n请输入时间矩阵的数值";Createmgraph(2,n,e; /*建立时间矩阵*/printf("\n无向图的存储结构建立完毕!\n";do{printf("\n\n\n************进行最短查询************\n";printf("=========================================\n";printf("1.求一个城市到所有城市的最短路径\n";printf("2.求一个城市到所有城市的最短时间\n";printf("3.退出\n";printf("=========================================\n";printf("请输入选择:";scanf("%d",&z; /*输入选择选择矩阵*/city_number(;if(z==1{printf("\n选择1 求一个城市到所有城市的最短路径\n";printf("求单源路径,输入源点v :"; /*输入源点v0*/scanf("%d",&v;Dijkstra(1,v,n; /*计算最短距离*/}else if(z==2{printf("\n选择2 求一个城市到所有城市的最短时间\n"; printf("求单源路径,输入源点,u :";scanf("%d",&u;Dijkstra(2,u,n; /*计算最短时间*/}else if(z==3printf("\n结束查询!谢谢使用!!\n";else printf("输入错误!!\n"; /*输入不为1-3则重新选择*/ }while(z!=3; /*输入3则退出*/printf("谢谢您的使用,再见!!!!\n";}五、调试分析一、运行结果1、输入顶点总数为6,边的总数为10,并输入顶点信息。
C语言版数据结构最短路径

二.最短路径详细设计#include <stdio.h>#define MAXV 100 /*最大顶点个数*/#define INF 32767 /*用32767表示∞*/typedef int InfoType;/*以下定义邻接矩阵类型*/typedef struct{ int no; /*顶点编号*/InfoType info; /*顶点其他信息*/} VertexType; /*顶点类型*/typedef struct /*图的定义*/{ int edges[MAXV][MAXV]; /*邻接矩阵*/int vexnum,arcnum; /*顶点数,弧数*/VertexType vexs[MAXV]; /*存放顶点信息*/} MGraph; /*图的邻接矩阵类型*/void DispMat(MGraph g)/*输出邻接矩阵g*/{int i,j;for (i=0;i<g.vexnum;i++){for (j=0;j<g.vexnum;j++)if (g.edges[i][j]==INF)printf("%3s","∞");elseprintf("%3d",g.edges[i][j]);printf("\n");}}void Dijkstra(MGraph g,int v0) /*狄克斯特拉算法从顶点v0到其余各顶点的最短路径*/{int dist[INF], path[MAXV], s[MAXV], n;int p[MAXV][MAXV]; //存放是否有路径0?1int v;for(v=0;v<g.vexnum;++v){s[v]=0;dist[v]=g.edges[v0][v];for(n=0;n<g.vexnum;++n) //初始为空路径p[v][n]=0;if(dist[v]<INF)p[v0][v]=1;}dist[v0]=0;s[v0]=1; //将v0加入s集for(int i=1;i<g.vexnum;i++)//主循环,每次求v0到某个v顶点的最短路径,并加v 到s集{int min=INF; //min为当前所知离v0最近的距离for(n=0;n<g.vexnum;++n)if(!s[n]) //n顶点在v-s中if(dist[n]<min){v=n;min=dist[n];}s[v]=1; //v加入s集for(n=0;n<g.vexnum;++n) //更新当前最短距离if(!s[n] && (min+g.edges[v][n]<dist[n])){dist[n]=min+g.edges[v][n];//修改,n属于v-spath[n]=path[v];p[n][v]=1;}printf("到%d点的最短路径为:%d\n",v,dist[v]);}}void main(){int i,j,u=0;MGraph g;int A[MAXV][6]={{INF,5,INF,7,INF,INF},{INF,INF,4,INF,INF,INF},{8,INF,INF,INF,INF,9},{INF,INF,5,INF,INF,6},{INF,INF,INF,5,INF,INF},{3,INF,INF,INF,1,INF}};g.vexnum=6;g.arcnum=10;for (i=0;i<g.vexnum;i++) /*建立图9.1的邻接矩阵*/for (j=0;j<g.vexnum;j++)g.edges[i][j]=A[i][j];printf("\n");printf("有向图G的邻接矩阵:\n");DispMat(g);printf("从0点出发到各顶点的最短路径:\n");Dijkstra(g,u);printf("\n");}测试结果。
c语言课程设计最短路径

c语言课程设计最短路径一、教学目标本节课的教学目标是让学生掌握C语言中最短路径算法的基本概念和实现方法。
具体包括以下三个方面:1.知识目标:使学生了解最短路径问题的背景和意义,理解Dijkstra算法和A*算法的原理,学会使用C语言实现最短路径算法。
2.技能目标:培养学生运用C语言解决实际问题的能力,提高学生的编程技巧和算法思维。
3.情感态度价值观目标:激发学生对计算机科学的兴趣,培养学生的创新精神和团队合作意识。
二、教学内容本节课的教学内容主要包括以下几个部分:1.最短路径问题的定义和意义:介绍最短路径问题的背景,让学生了解其在实际应用中的重要性。
2.Dijkstra算法:讲解Dijkstra算法的原理,演示算法的实现过程,让学生学会使用C语言实现Dijkstra算法。
3.A算法:介绍A算法的原理,讲解算法的优势和不足,让学生了解并掌握A*算法的实现方法。
4.算法优化:讨论如何优化算法,提高算法的效率,让学生学会在实际问题中灵活运用算法。
三、教学方法为了达到本节课的教学目标,将采用以下几种教学方法:1.讲授法:讲解最短路径问题的基本概念和算法原理,让学生掌握基本知识。
2.案例分析法:分析实际问题,让学生了解最短路径算法在实际应用中的价值。
3.实验法:让学生动手实践,学会使用C语言实现最短路径算法,提高编程能力。
4.讨论法:学生进行小组讨论,培养学生的团队合作意识和创新精神。
四、教学资源为了支持本节课的教学内容和教学方法,将准备以下教学资源:1.教材:《C语言程序设计》2.参考书:《数据结构与算法分析》3.多媒体资料:最短路径算法的动画演示4.实验设备:计算机、网络设备通过以上教学资源的支持,相信能够有效地帮助学生掌握最短路径算法,提高学生的编程能力。
五、教学评估为了全面、客观地评估学生在最短路径算法学习过程中的表现,将采用以下评估方式:1.平时表现:观察学生在课堂上的参与程度、提问回答和小组讨论的表现,以了解学生的学习态度和理解程度。
数据结构课程设计报告_最短路径

青岛理工大学琴岛学院
设计报告
课题名称:数据结构课程设计
学院:计算机工程系
专业班级:计算机网络技术
学号:aaaaaa
学生: aaa
指导教师: aaaaaaa
青岛理工大学琴岛学院教务处
2011 年 12 月 18日
四.调试分析(调试过程中出现的问题及处理方式)调试出现的界面
1)进入程序弹出查询信息对话框如图2:
图2
2) 输入查询信息,显示路径长度及最短路径,如果输入代号不在0~24之内,提示出错。
图3
图4
B.出现的问题及解决方式
1、在执行程序的时候不能显示最短的距离
解决方法:增加一个函数调用,调用的函数为ShortestPath(v0); /*计算两个城市之间的最短路径*/
2、不能连续查询,即查询一次完成后,必须重新运行才能就进行二次查询
解决方法:在代码中添加while( ) 语句printf("是否继续,1(继续查询),0(退出查询)");
printf("\n"); scanf("%d",&ch); 详见图5
图 5。
数据结构最短路径课设报告

数据结构与算法课程设计报告书题目:导航最短路径查询班级:11101111学号:**********姓名:教师周期:2012.12.17-2012.12.21 (以下由验收教师填写)成绩:2012年12月21日《导航最短路径查询》一、课程设计的目的与要求(一)课程设计目的与任务通过学习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、编码集成以及调试分析,熟练掌握数据结构的选择、设计、实现、以及操作方法,为进一步的开发应用打好基础。
(二)题目要求要求在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
二、设计正文1、系统分析和开发背景该程序所做的工作是给司机们提供最佳路线,来提高能源和时间的合理利用。
(1)把城市交通线路转化为图,从而对图进行相应的结构存储;(2)程序的输出信息主要为:起始城市到目的城市的最短路路径。
(3)程序的功能主要包括:城市之间路径的存储,最短路径的计算,以及最短路径和邻接矩阵的输出;2 、功能详细描述先假设有四个城市甲乙丙丁,甲乙相距2千米,且只有从乙到甲的单程线路。
甲丙相距7千米,且只有从甲到丙的单程线路。
甲丁相距4千米,且只有从甲到丁的单程线路。
乙丙相距5千米,且只有从丙到乙的单程线路。
乙丁相距3千米,且只有从丁到乙的单程线路。
丙丁相距3千米,且只有从丁到丙的单程线路。
戊甲相距6千米,且只有从戊到甲的单程线路。
戊丁相距2千米,且只有从丁到戊的单程线路。
乙己相距8千米,且只有从乙到己的单程线路。
丙己相距6千米,且只有从己到丙单程线路。
编程出能求出个一点到任一点的最短路经。
3、数据结构设计(1)typedef struct{int no; //顶点编号InfoType info; //顶点其他信息,这里用于存放边的权值}VertexType; //顶点类型typedef struct //图的定义{int edges[MAXV][MAXV]; //邻接矩阵int n,e; //顶点数,弧数VertexType vexs[MAXV]; //存放顶点信息}MGraph; //图的邻接矩阵类型//以下定义邻接表类型typedef struct ANode //弧的结点结构类型{int adjvex; //该弧的终点位置struct ANode *nextarc; //指向下一个弧的指针InfoType info; //该弧的相关信息,这里用于存放权值}ArcNode;typedef int Vertex;typedef struct Vnode //邻接表头结点的类型{Vertex data; //顶点信息ArcNode *firstarc[MAXV]; //指向第一条弧}VNode;typedef VNode AdjList[MAXV];//AdjList是邻接表类型typedef struct{AdjList adjlist; //邻接表int n,e; //图中顶点数n和边数e}ALGraph; //图的邻接表类型4、主要功能逻辑过程和实现算法用到的主要函数:(1)void DispMat(MGraph g) //输出邻接矩阵(2)void ppath(int path[][MAXV],int v,int endv) //输出相应选择的起点和终点的最短路。
数据结构课程设计最短路径问题实验报告

目录交通咨询系统设计(最短路径问题)一、概述在交通网络日益发达的今天,针对人们关心的各种问题,利用计算机建立一个交通咨询系统。
在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的交通关系,所带权值为两个城市间的耗费。
这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从A城到B城途中中转次数最少;如何选择一条路径使得从A城到B城里程最短;如何选择一条路径使得从A城到B城花费最低等等的一系列问题。
二、系统分析设计一个交通咨询系统,能咨询从任何一个城市顶点到另一城市顶点之间的最短路径(里程)、最低花费或是最少时间等问题。
对于不同的咨询要求,可输入城市间的路程、所需时间或是所需费用等信息。
针对最短路径问题,在本系统中采用图的相关知识,以解决在实际情况中的最短路径问题,本系统中包括了建立图的存储结构、单源最短问题、对任意一对顶点间最短路径问题三个问题,这对以上几个问题采用了迪杰斯特拉算法和弗洛伊德算法。
并未本系统设置一人性化的系统提示菜单,方便使用者的使用。
三、概要设计可以将该系统大致分为三个部分:① 建立交通网络图的存储结构;② 解决单源最短路径问题;③ 实现两个城市顶点之间的最短路径问题。
四、详细设计建立图的存储结构定义交通图的存储结构。
邻接矩阵是表示图形中顶点之间相邻关系的矩阵。
设G=(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下定义的n阶方阵。
注:一个图的邻接矩阵表示是唯一的!其表示需要用一个二维数组存储顶点之间相邻关系的邻接矩阵并且还需要用一个具有n个元素的一维数组来存储顶点信息(下标为i的元素存储顶点V的信息)。
i邻接矩阵的存储结构:附录#include<>#include<>#defineMVNum100#defineMaxint32767enumboolean{FALSE,TRUE}; typedefcharVertexType;typedefintAdjmatrix;typedefstruct{VertexTypevexs[MVNum];Adjmatrixarcs[MVNum][MVNum];}MGraph;intD1[MVNum],p1[MVNum];intD[MVNum][MVNum],p[MVNum][MVNum]; voidCreateMGraph(MGraph*G,intn,inte){inti,j,k,w;for(i=1;i<=n;i++)G->vexs[i]=(char)i;for(i=1;i<=n;i++)for(j=1;j<=n;j++)G->arcs[i][j]=Maxint;printf("输入%d条边的及w:\n",e);for(k=1;k<=e;k++){scanf("%d,%d,%d",&i,&j,&w);G->arcs[i][j]=w;}printf("有向图的存储结构建立完毕!\n"); }voidDijkstra(MGraph*G,intv1,intn){intD2[MVNum],p2[MVNum];intv,i,w,min;enumbooleanS[MVNum];for(v=1;v<=n;v++){S[v]=FALSE;D2[v]=G->arcs[v1][v];if(D2[v]<Maxint)p2[v]=v1;elsep2[v]=0;}D2[v1]=0;S[v1]=TRUE;for(i=2;i<n;i++){min=Maxint;for(w=1;w<=n;w++)if(!S[w]&&D2[w]<min){v=w;min=D2[w];}S[v]=TRUE;for(w=1;w<=n;w++)if(!S[w]&&(D2[v]+G->arcs[v][w]<D2[w])){D2[w]=D2[v]+G->arcs[v][w];p2[w]=v;}}printf("路径长度路径\n");for(i=1;i<=n;i++){printf("%5d",D2[i]);printf("%5d",i);v=p2[i];while(v!=0){printf("<-%d",v);v=p2[v];}printf("\n");}}voidFloyd(MGraph*G,intn){inti,j,k,v,w;for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(G->arcs[i][j]!=Maxint)p[i][j]=j;elsep[i][j]=0;D[i][j]=G->arcs[i][j];}for(k=1;k<=n;k++){for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(D[i][k]+D[k][j]<D[i][j]){D[i][j]=D[i][k]+D[k][j];p[i][j]=p[i][k];}}}}voidmain(){MGraph*G;intm,n,e,v,w,k;intxz=1;G=(MGraph*)malloc(sizeof(MGraph));printf("输入图中顶点个数和边数n,e:");scanf("%d,%d",&n,&e);CreateMGraph(G,n,e);while(xz!=0){printf("************求城市之间最短路径************\n");printf("=========================================\n");printf("1.求一个城市到所有城市的最短路径\n");printf("2.求任意的两个城市之间的最短路径\n");printf("=========================================\n");printf("请选择:1或2,选择0退出:\n");scanf("%d",&xz);if(xz==2){Floyd(G,n);printf("输入源点(或起点)和终点:v,w:");scanf("%d,%d",&v,&w);k=p[v][w];if(k==0)printf("顶点%d到%d无路径!\n",v,w);else{printf("从顶点%d到%d最短路径路径是:%d",v,w,v);while(k!=w){printf("--%d",k);k=p[k][w];}printf("--%d",w);printf("径路长度:%d\n",D[v][w]);}}elseif(xz==1)printf("求单源路径,输入源点v:");scanf("%d",&v);Dijkstra(G,v,n);}printf("结束求最短路径,再见!\n"); }。
最短路径_数据结构课程设计报告

最短路径_数据结构课程设计报告第一篇:最短路径_数据结构课程设计报告数据结构课程设计《数据结构》课程设计报告设计题目:____医院选址____________ 姓名:__________________ 学号:________________ 专业:___________院系:____________班级:_________________ 指导教师:_________________年 1月 3 日数据结构课程设计一、问题描述(1)题目内容:有n个村庄,现要从这n个村庄中选择一个村庄新建一所医院,使其余的村庄到这所医院的距离总和来说较短。
(n>=5)(2)基本要求:(3)可以输出每一对点间的路径长度;然后选取偏心度,最小的偏心度即为所求。
二、需求分析(4)本程序的功能包括找出每一对点间的路径长度。
(5)然后算出每一对点的偏心度。
(6)其中最小的偏心度即为所求。
三、概要设计操作集合:(7)public:MGraph(DataType a[],int b[][MaxSize],int n,int e);//初始化邻接矩阵和路径(8)void Floyd();//弗洛伊德算法的实现(9)void getE();//获取偏心度(10)void showdist();//把每一对顶点之间的路径权值show出来(11)~MGraph(){} //类的析构函数四、数据结构设计(1)DataType vertex[MaxSize];//存放图中顶点的数组(2)intarc[MaxSize][MaxSize];//存放图中边的数组(3)string path[MaxSize][MaxSize];//存放从Vi到Vj的最短路径,初始为//path[i][j]=“ViVj”(4)int dist[MaxSize][MaxSize];//存放求得的最短路径长度(5)int vertexNum, arcNum;//图的顶点数和边数(6)int E[MaxSize][2];//获取最小偏心度和该顶点五、算法设计1.算法分析1)对带权有向图的,调用Floyd算法,对每一对顶点间的最短路径长度的矩阵;2)对最短路径长度矩阵的每列求最大值,即得到各点的偏心度;3)具有最小偏心度的顶点即为所求。
数据结构迷宫最短路径实验报告

实验报告课程名:数据结构(C语言版)实验名:迷宫问题II姓名:班级:学号:撰写时间:2014/10/10一实验目的与要求1. 了解栈的应用2. 利用栈在迷宫中找到一条路二实验内容•一个迷宫如图1所示, 是由若干个方格构成的一个矩形, 其中有唯一的一个入口(用⃝标示), 有唯一的一个出口(用△标示). 图中深色的方格无法到达, 浅色的方格都是可以到达的. 每一次只能从当前方格前进到与当前方格有公共边的方格中(因此前进方向最多有四个).•本次实验的迷宫问题要求找到从入口到出口的最短的路.图1:迷宫三实验结果与分析程序:#include <stdio.h>#include <stdlib.h>int Maze(int ox,int oy,int ex,int ey,int rnum,int cnum,int a[rnum][cnum]){int b[rnum][cnum];int i,j,Znum=0;for(i=0;i<rnum;++i){for(j=0;j<cnum;++j){b[i][j]=a[i][j];if(a[i][j]==0){Znum=Znum+1;}}}int Qx[Znum+1], Qy[Znum+1], P[Znum+1], head=0, tail=0; for(i=0;i<Znum+1;++i){Qx[i]=-10;Qy[i]=-10;P[i]=-10;}/*int dx[4] = {0,1,0,-1};int dy[4] = {-1,0,1,0};int neighbor_num = 4;*/int dx[8] = {-1, 0, 1,1,1,0,-1,-1};int dy[8] = {-1,-1,-1,0,1,1, 1, 0};int neighbor_num = 8;if(ox==ex && oy==ey){printf("(%d,%d)",ox,oy);}else{Qx[tail]=ox;Qy[tail]=oy;P[tail]=-1;++tail;b[ox][oy]=2;}int brand = -1;while(tail>head){for(i=0;i<neighbor_num;i++){int tx = Qx[head]+dx[i];int ty = Qy[head]+dy[i];if(b[tx][ty]==0){if(tx==ex && ty==ey){printf("(%d,%d), ",tx,ty);int t = head;while(t>=0){printf("(%d,%d), ",Qx[t],Qy[t]);t=P[t];}head=tail;brand=1;break;}else{Qx[tail]=tx;Qy[tail]=ty;P[tail]=head;++tail;b[tx][ty]=2;}}}++head;}return(brand);}int main(int argc, char *argv[]) {int rnum = 10;int cnum = 10;int a[10][10]={{1,1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,0,0,1,1,0,0,1},{1,0,1,1,1,0,0,0,0,1},{1,0,0,0,1,0,0,0,0,1},{1,0,1,0,0,0,1,0,0,1},{1,0,1,1,1,0,1,1,0,1},{1,1,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1}};//假设外面有一层不可到达的方块,故迷宫成了10乘10型int ox=1,oy=1,ex=rnum-2,ey=cnum-2;int brand = Maze(ox,oy,ex,ey,rnum,cnum,a);if(brand<0){printf("There is no way\n");}return 0;}图1:实验结果截图。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
青岛理工大学琴岛学院
设计报告
课题名称:求解最优交通路径
学院:计算机工程系
专业班级:计算机科学与技术
学号:#######
学生:**
指导教师:**
青岛理工大学琴岛学院教务处
2011 年 7 月 7日
图1
B.具体功能实现及相应的弗洛伊德算法
首先,建立查询信息对话框,使用户能够录入需要查询的城市代号,并显示路径长度及最短路径沿途经过的城市。
并相应地添加如下变量int m_v0;int m_v1;int m_lj;CString m_zd;
具体代码如下:
#define MAXV 25 //最大顶点个数
#define INF 32767 //用32767表示∞
//以下定义邻接矩阵类型
typedef struct
{ int no; //顶点编号
char name[10]; //顶点名称
} VertexType; //顶点类型
typedef struct //图的定义
{ int edges[MAXV][MAXV]; //邻接矩阵
int vexnum,arcnum; //顶点数,弧数
VertexType vexs[MAXV]; //存放顶点信息
} MGraph; //图的邻接矩阵类型
1.通过函数CreatUDN()存放城市路径信息,输入顶点之间的路径长度,创建带权图的邻接矩阵。
void CTDialog::CreatUDN()
{
MGraph *g=(MGraph*)malloc(sizeof(MGraph));
int i,j;
for(i=0;i<MAXV;i++) //录入权值,计算存储用
for(j=0;j<MAXV;j++)
{
g->edges[i][j]=INF;
if(i==j)g->edges[i][j]=0; //初始化置任意两城市之间距离为无穷大,即两城市之间没有直接通路
{
if(i!=j)
m_zd="没有路径";
}
else if(x==i&&y==j)
{
m_lj=A[i][j];
CString zfc;
zfc.Format("%d",i); //输出路径上的起点
m_zd+=zfc;
ppath(path,i,j); //输出路径上的中间点
zfc.Format("-->%d",j); //输出路径上的终点
m_zd+=zfc;
}
}
}
4.输出最短路径函数,递归输出从顶点i到j的最短路径中依次经过的顶点,直到path[i][j]=-1,即没有中间顶点为止。
void CTDialog::ppath(int path[][MAXV], int i, int j)
{
int k;
k=path[i][j];
if (k==-1) return;
ppath(path,i,k);
CString zfc;
zfc.Format("-->%d",k);
m_zd+=zfc;
ppath(path,k,j);
}
四.调试分析(调试过程中出现的问题及处理方式)
A.调试出现的界面
1)进入程序弹出查询信息对话框如图2:
图2
2)输入查询信息,显示路径长度及最短路径,如果输入代号不在0~24之内,提示出错。
如图3、图4:
图3 图4
3)查询成功后,可修改城市代号反复查询。
B.出现的问题及解决方式
1)提出问题:地图导入后,起初无法导入正常导入到VC++6.0,而6.0以上的版本可以,后来导入经过调试无法在界面上显示。
分析问题:VC++6.0版本较低,无法支持分辨率较高的图形。
图形无法显示的问题,可能是图形并没有与界面联系起来。
解决方法:在将地图导入之前,将地图的保存为分辨率较低的bmp位图,即可导入到VC++6.0。
界面无法显示,是没有将位图画刷选入。
添加相关函数pDC->BitBlt(nX, nY, bmpInfo.bmWidth,bmpInfo.bmHeight,&dcMemory,0,0,SRCCOPY)即可显示。
2)提出问题:将C语言代码添加到相关函数中,系统无法识别无法编译。
分析问题:应该添加一些C++可以识别的C的相关信息,使之联系起来。
解决方法:包含进相关头文件,即添加#include <stdio.h>、#include<stdlib.h>。
3)提出问题:一开始将主要代码添加到View类中,在对话框接收到参数通过(WPARAM wParam,LPARAM lParam)实现参数的传递,同时却需要在View类中接收和初始化的一些列问题,增加了不必要的麻烦。
分析问题:可以通过其他方式,减少参数传递过程。
解决方法:直接在对话框添加的类TDialog中,添加代码,省去了参数传递的麻烦。
4)提出问题:将课本上的弗洛伊德算法的相关代码添加后,与实际情况不符,课本上的路径都是全部两点之间的,而现实的交通图中是从用户输入的起始点到目的点。
分析问题:在参数传递时传递接收的起始点和目的点,然后只判断这两个点就可以了。
解决方法:修改判断语句,增加可通过的情况,if(x==i&&y==j&&A[i][j]==INF)和if(x==i&&y==j)添加双向的情况。
5)出现问题:将查询后的路径长度和最短路径在地图界面上显示。
通过pDC->Textout()显示。
而输出过程中,需要各个函数的递归实现,通过参数传递,在View中输出,显得不太现实。
在TDialog中输出,添加CDC *pDC后,依然无法显示。
包含入相关头文件#include "最短路径View.h"依然无效。
在相关函数中添加代码CDC *pDC=GetDC();也没有得到想要的显示。
分析问题:在现有知识和自己所能查到资料中,这种方法不便实现,即使实现后,只能查一次,反复查找需要刷新屏幕。
工作量大。
解决方法:在查询对话框中添加路径长度和最短路径的内容,直接在对话框中显示,即可反复查找,又省去了pDC不能使用的麻烦。
6)出现问题:运行程序后,无法弹出对话框。
弹出对话框后,在查询最短路径时,第一次查询正常,而之后的查询最短路径在之前的基础上不断添加。
分析问题:对话框不显示,应该是缺少相关的命令。
而路径出错,应该增加对应的语句使每次查询,显示路径的对话框能过刷新一次。