最短路径求解问题

问题背景

无人船在原点处接收到m个点的位置坐标,然后从原点出发,依次经过这m个点,且保证路径最短

算法讲解

采用遍历方法,依次求取每条路径长度,最后得出最短路径和行走顺序

#include<stdio.h>
#include<math.h>
typedef struct place
{
	float x;
	float y;
}PLACE;
int main()
{
	int m=3;
	PLACE point[m+1];
	float length[m][m];
	int	  arrange[500][m+1];
	//输入数据初始化
	point[0].x=0;
	point[0].y=0;
	for(int i=1;i<=m;i++)
	{
		scanf("%f",&point[i].x);
		scanf("%f",&point[i].y);
	}
	//求两点间的距离
	for(int a=0;a<=m;a++)
	{
		for(int b=a+1;b<=m;b++)
		{	
			length[a][b]=sqrt((point[a].x-point[b].x)*(point[a].x-point[b].x)+(point[a].y-point[b].y)*(point[a].y-point[b].y));
			length[b][a]=length[a][b];
			printf("[%d]和[%d]之间的距离为%f\n",a,b,length[a][b]);
		}
	}
	//全排列
	//------------------输入数量设计 
	int n=0;
	for(int c=1;c<=m;c++)
	{
		for(int d=1;d<=m;d++)
		{
			for(int e=1;e<=m;e++)
			{
				if(c!=d&&c!=e&&d!=e)
				{
					n++;
					arrange[n][1]=c;
					arrange[n][2]=d;
					arrange[n][3]=e;
					printf("%d,%d,%d\n",c,d,e);
				}
			}
		}
	} 
	//求最短路径
	int shortflag=1;
	double shortestpath;
	shortestpath=length[0][1]+length[1][2]+length[2][3];
	for(int f=1;f<=n;f++)
	{
		float pathtest;
		pathtest=length[0][arrange[f][1]]+length[arrange[f][1]][arrange[f][2]]+length[arrange[f][2]][arrange[f][3]];
		if(pathtest<shortestpath)
		{
			shortestpath=pathtest;
			shortflag=f;
		}
		}	
	printf("最短路径为%f,最短序列为0->%d->%d->%d",shortestpath,arrange[shortflag][1],arrange[shortflag][2],arrange[shortflag][3]);
//最短路径:shortflag
//顺序:0->arrange[shortflag][0]->arrange[shortflag][1]->arrange[shortflag][2]	
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z金金金金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值