给出坐标的几点之间的最短路径问题 用C语言解 求高手帮忙

来自:星空有你    更新日期:早些时候
C语言高手!!帮忙写个最短路径程序!!!!~

这是我们的一个实验,你可以参考一下
一、 需求分析
【问题描述】
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】
(1) 设计你所有学校的校园平面图,所含景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
(2) 为来访客人提供图中任意景点相关信息的查询。
(3) 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
【测试数据】
由读者根据实际情况指定。
二、概要设计
本次实验中运用到的数据类型有:图,顶点,边结点
typedef struct edgenode
{
int adjvex; //临接点序号
int length; //道路长度
char name[20]; //景点名称
char info[100]; //景点详细信息
struct edgenode *next;
}edgenode, *Node ;
typedef struct
{
char data[20]; //存储景点的名称.
char str[100]; //具体的介绍此景点
struct edgenode *link; //指向下一个景点
}vexnode; //景点及其信息.
typedef struct Edge
{
int lengh; //边的权值,表示路径长度.
int ivex, jvex; //边的两端顶点号
struct Edge *next; //指向下一条边
} EdgeType; //边及其信息.
typedef struct
{
int num; //顶点编号
char data[20]; //顶点名称
} vertex;
typedef struct{
vertex vexs[MAX]; //顶点集合
int edges[MAX][MAX]; //邻接矩阵
}adjmax;
基本操作:
void fun();
//操作结果:功能说明并显示所有景点
void creatgraph(vexnode g[],int &n, EdgeType e[],adjmax &adj);
//操作结果:创建校园图
void travgraph(vexnode g[],int n,adjmax adj);
//初始条件:已知邻接表adj和顶点g及其数目n
//操作结果:查找指定景点信息
void Ppath(int path[][MAX],int i,int j,vexnode g[]);
//操作结果:寻找最短路径
void Dispath(int A[][MAX],int path[][MAX],int n,vexnode g[]);
//初始条件:已知顶点g和数目n及其权值
//操作结果:显示最短路径
void Floyd(adjmax adj,int n,vexnode g[]);
//初始条件:已知邻接表adj和顶点g
//操作结果:Floyd算法计算所有两个景点间最短路径
三、详细设计
1、---------main()---------
char choice;
int n = 0; / /景点数目
vexnode g[MAX]; //保存顶点及其信息
EdgeType e[MAXedg]; //保存边及其信息
adjmax adj; //保存边和定点

creatgraph(g,n,e,adj); //建立校园导游图
while(1)
{
do{
system("cls");
fun(); //功能说明
printf("请输入所要进行的操作:");
choice=getch();
printf("
"); }while(choice!='s'&&choice!='S'&&choice!='v'&&choice!='V'&&choice!='Q'&&choice!='q');
switch(choice)
{
case('s'):
case('S'): Floyd(adj,n,g); //查找最短路径
break;
case('v'):
case('V'):travgraph(g,n,adj); //景点查询
break;
case('q'):
case('Q'):return; //结束程序
}
}
2、------- travgraph()---------
void travgraph(vexnode g[],int n,adjmax adj)
{
int i = 1,flag = 1,num; //num存储要查询的景点的序号
char ch;
edgenode *p;
printf("请输入您要查询的景点序号:
");
scanf("%d",&num);
while(i <= n) //遍历邻接表
{
p = g[i].link;
if(i == num && flag == 1)
{
printf("此景点的名称是: %s
",g[i].data);
printf("此景点的介绍是: %s
",g[i].str);
printf("是否继续? Y/N");
ch=getch();
printf("
");
if(ch == 'Y' || ch == 'y') //继续
{
flag = 1;
i = 1;
printf("请输入您要查询的景点序号:
");
scanf("%d",&num);
getchar();
}
else
flag = 0; //不继续
}
else
i++;
}
}3、------- Floyd()---------
//Floyd算法计算所有两个景点间最短路径
void Floyd(adjmax adj,int n,vexnode g[])
{
int A[MAX][MAX],path[MAX][MAX]; //A是路径长度,path是路径。
int i,j,k;
for(i = 1; i <= n; i++) //初始化
for(j = 1; j <= n; j++)
{
A[i][j] = adj.edges[i][j]; //i j之间长度
if(i == j)
{
A[i][j] = 0;
}
path[i][j] = -1; //初始化
}
for(k = 1; k <= n; k++)
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
{
if(A[i][j] > (A[i][k] + A[k][j]))
{
A[i][j] = A[i][k]+A[k][j]; //修改最短路径长度值
path[i][j] = k; //将最短路径的节点号保存
}
}
Dispath(A,path,n,g); //用户输入,查找任意两个景点间的最短路径。
}

这是我写的程序和运行的结果,如果有不会的地方依然可以问我。
/*
首先我想说明几点问题。
1.我不知道你的题意中的路径是单向的还是双向的,不过我把路径设置成双向的了
2.说一下我程序的输入,首先输入一个n,表示该图中有n条路;然后有n行,每行
两个数x, y(1<=x, y<=99),表示这两个地点有一条路径。最后输入两个数,
表示计算这两点之间所有的路径
3.我的思路用的是深搜,不过广搜也是可以的
*/
#include
#include
int path[100][100];///path[i][j]为0表示i, j两点之间不通,为1表示有一条路
int stack[120], m=1, n, x, y;///存储路径
void dfs(int p)
{
int i, j;
for(i=1; i<=100; i++)
{
if(path[p][i]==1)
{
if(i == y)///如果深搜到了终点,就输出刚才经过的路径
{
for(j=0; j<m; j++)
{
printf("%-5d", stack[j]);
}
printf("%-5d
", y);
}
else///如果该点不是终点
{
stack[m] = i;///将该点存起来
m++;
dfs(i);///接着深搜
m--;
}
}
}
}
int main()
{
int i, j;
memset(path, 0, sizeof(path));
scanf("%d", &n);
for(i=0; i<n; i++)
{
scanf("%d %d", &x, &y);
path[x][y] = path[x][y] = 1;///这两点之间有路径
}
scanf("%d %d", &x, &y);
stack[0] = x;
dfs(x);
}

最笨的枚举法,先算第一个点距离剩下点的最短路径,然后把第一点排除最外求剩下点最短,循环直到剩下两点。
#include <stdio.h>
#include <stdlib.h>
#define N 10

//返回最短距离的平方,两个点下标分别存在index1和index2中
//x为所有点x坐标数组,y为所有点y坐标数组,n为个数
int getShortest(int *x,int *y,int n,int& index1,int& index2);
int main(int argc, char **argv)
{
int x[10]={11,3,5,7,1,10,17,18,19,20};
int y[10]={0};
int index1,index2;

printf("%d %d %d \n",getShortest(x,y,10,index1,index2),index1,index2);
return 0;
}
/*
* 简要描述:先找出离第一个点最近的点,再把第一个点排除在外,
* 求剩余n-1个点中最近距离,递推直到剩下两个点,算法结束
*
*
* */
int getShortest(int *x,int *y,int n,int &minP1,int &minP2)
{

int *px,*py,*currX,*currY;
int minX,minY;
//当前点与第一个点之间的坐标差值
minX = abs(*(x+1) - *x);
minY = abs(*(y+1) - *y);
//坐标差值绝对值
int absX,absY;
//最短距离平方
long minLen2 ;
long currLen2;
//当前两点的索引
int *endIndex=x+1;
int *beginIndex=x;
for (px=x,py=y;px<x+n-1;px++,py++)
{

currX = px+1;
currY = py+1;
minLen2 = minX*minX+minY*minY;
while (currX<x+n)
{
absX = abs(*currX-*px);
absY = abs(*currY-*py);
/*比较大小*/
//x,y方向距离都比最小的小,无须计算
if (absX<minX&&absY<minY)
{
minX = absX;
minY = absY;
endIndex = currX;
beginIndex = px;
}
//x,y方向距离一个大一个小,计算平方比较
else if ((absX<minX&&absX>minY)||(absX<minX&&absX>minY))
{
currLen2 = (absX*absX+absY*absY);
if (minLen2>currLen2)
{
minLen2 = currLen2;
minX = absX;
minY = absY;
endIndex = currX;
beginIndex = px;
}
}
currX++;
currY++;
}
}
minP1 = beginIndex - x;
minP2 = endIndex - x;
return minLen2;
}


给出坐标的几点之间的最短路径问题 用C语言解 求高手帮忙视频

相关评论:
  • 13387462449两维坐标系中,仅能一次沿x或y走一步,从原点走到点的最短路径有...
    平黛汤每个点有两种走法,为了最短,不能回头,如果一个方向已经走完,另一个方向只有一条路可以走。设点(x,y)横向走1步,用a表示;纵向走一步用b表示,共走|x|a|y|b |x|个a,|y|个b的可以区分的排列总数,就是路径数。|x|个a是不同的,记为a1,a2,a3,...,a|x|;b1,b2,b3,...

  • 13387462449最短路径问题解题技巧
    平黛汤将每个编号表示的点的坐标计算出来,以x、y、z表示三个方向上的坐标。计算从A点到其它点的距离,再选出最短距离。最短距离就是蚂蚁爬行的最短路径。解题技巧:1 投影法 投影法是解决长方体蚂蚁最短路径问题的一种常用技巧。它的基本思想是将长方体展开成一个平面图,然后在平面图上求解最短路径。

  • 13387462449最短路径 数学建模
    平黛汤还好这个问题不是个比较复杂的问题。如果想不同,可以分析一下,正方形上,非离散,而是连续的点,在任意两点之间空间距离和可新增边的实际距离的关系。就可以了。但这个问题绝对不是最短路径问题。因为不同起点和终点,空间距离是随着顶点的不同而变化的。所以是否需要新增边,需要根据三角形来判断。而...

  • 13387462449已知地球上两点的经纬度,如何求这两点间的距离?
    平黛汤测地线,作为地球尺寸与形状大地测量学中的重要概念,描述了两点之间的局域最短路径。在地球表面上,这些路径被称为大圆,是连接两点间的最短路径。在飞行领航或广义相对论中,物体遵循四维时空的测地线移动。为了求解地球上两点间的距离,小O地图新增了计算测地线距离和目的地估算功能。使用小O地图EXCEL...

  • 13387462449节约里程法如何确定两点位置
    平黛汤“节约里程法”通常用于解决旅行商问题(TSP),即给定多个城市之间的距离,求出访问每个城市恰好一次并回到起点的最短路径。在“节约里程法”中确定两点位置的方法如下:1. 确定一个起点城市,在所有未访问的城市中选择一个与起点城市距离最近的城市作为下一个访问点,并做标记表示已经访问。2. 在所有已...

  • 13387462449从原点出发,遍历50个点,再回到原点的最短路径,求matlab程序
    平黛汤参见 K条路算法测试程序 Dijkstra算法求最短路径:Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。Dijkstra算法是很有代表性的最短路...

  • 13387462449求最短路径问题 送货郎问题
    平黛汤在本题中,根据上述要求,求出了两种可行解,但是由于本题的特殊性(即街道和坐标轴平行),两条路径中没有相同的运行路线,也就是说最终的拟合结果就是解一的结果。因此,可行解一就是本题中的最优解。至此,B题中的第一问已经解决了。即需要5个业务员,每个业务员的运行线路如下:第一个人:0-1-3-4-5-0和0-...

  • 13387462449什么叫距离
    平黛汤距离是一种空间上的概念,用来描述两个点或物体之间相隔的程度。它可以表现为直线或者曲线的长度,通常是三维空间中两点之间的最短路径长度。在生活中,我们常常用距离来描述两个地点之间的距离,如两城市之间、家与工作地点之间的距离等。在几何学中,距离更是重要的概念,用来描述点和点之间、线和线...

  • 13387462449如图,在直角坐标系中,每条横线和竖线代表一条路,小明从学校(点O)放学...
    平黛汤从O点到C点,按理直线(斜的)最短,但是你说横线和竖线才是路,所以从O点到C点,要么先横着走一段再竖着走一段,要么先竖后横,有2个方案,从C到B又是2个方案,...,每到下一个目标都面临2种选择,所以一共2^4=16种方案

  • 133874624492011数学建模国赛B题 求解答
    平黛汤根据给出的地图和其他数据,运用matlab软件使用Dijkstra算法以及floyd算法,确定出了最短路径,从而可以计算得出每个巡警台所能控制的范围。不仅仅要考虑运行路线的最短和优化性,还要考虑时间尽可能较少的优化。问题二三.基本假设1.不考虑巡警在实际工作中所出现的故障而导致延误追捕。2.假设各站点的警力量是平均一致且为...

  • 相关主题精彩

    版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

    Copyright © 喜物网