问题背景
无人船在原点处接收到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]
}