由于只有8个点,所以可以用暴力枚举出所有2点距离,之后用字符串的字典序模拟路径
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX_SIZE 10
double dist[MAX_SIZE][MAX_SIZE];/*dist[i][j]表示i到j的距离*/
int main()
{
int n,cases=1;
while(scanf("%d",&n)&&n){
int x[MAX_SIZE];/*点i的横坐标*/
int y[MAX_SIZE];
memset(dist,0,sizeof(dist));
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
for(int i=0;i<n;i++)
scanf("%d%d",&x[i],&y[i]);
for(int i=0;i<n;i++)
for(int j=1;i+j<n;j++){
double s1=y[i+j]-y[i];
double s2=x[i+j]-x[i];
dist[i][j+i]=sqrt(s1*s1+s2*s2);
dist[i+j][i]=dist[i][i+j];
/*printf("%d->%d:%.2f\n",i,j+i,dist[i][j+i]);*/
}
/*枚举出所有2点的距离*/
/*下面暴力枚举出来*/
double mins=9999999;
char order[MAX_SIZE]="012345678";
char G[MAX_SIZE];
do
{
double sum=0;
for(int i=1;i<n;i++){
sum+=dist[order[i-1]-'0'][order[i]-'0']+16;
}
if(mins>sum){
strcpy(G,order);
mins=sum;
}
}while(next_permutation(order,order+n));
printf("**********************************************************\n");
printf("Network #%d\n",cases);
for(int i=1;i<n;i++)
{
int a=G[i-1]-'0';
int b=G[i]-'0';
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2f feet.\n",x[a],y[a],x[b],y[b],dist[a][b]+16);
}
printf("Number of feet of cable required is %.2f.\n",mins);
cases++;
}
return 0;
}