题意说最多有8个点,数很小,可以选择暴力求解。
运用的next_permutation
注意输出,在这里格式不对,WA了一次,郁闷。
#include<stdio.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct list
{
int x;
int y;
}s[100];
int main()
{
int n;
int leap_q=0;
while(scanf("%d",&n)&&n)
{
int i;
leap_q++;
int a[10];
for(i=0;i<n;i++)
{
scanf("%d%d",&s[i].x,&s[i].y);
a[i]=i;
}
double len,lenmin;
lenmin=1000000;
int b[10];
len=0;
for(i=1;i<n;i++)
{
len+=sqrt((s[a[i]].x-s[a[i-1]].x)*(s[a[i]].x-s[a[i-1]].x)+(s[a[i]].y-s[a[i-1]].y)*(s[a[i]].y-s[a[i-1]].y))+16;
}
if(len<lenmin)
{
for(i=0;i<n;i++)
{
b[i]=a[i];
}
}
while(next_permutation(a,a+n))
{
len=0;
for(i=1;i<n;i++)
{
len+=sqrt((s[a[i]].x-s[a[i-1]].x)*(s[a[i]].x-s[a[i-1]].x)+(s[a[i]].y-s[a[i-1]].y)*(s[a[i]].y-s[a[i-1]].y))+16;
}
if(len<lenmin)
{
for(i=0;i<n;i++)
{
b[i]=a[i];
}
lenmin=len;
}
}
printf("**********************************************************\n");
printf("Network #%d\n",leap_q);
for(i=1;i<n;i++)
{
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n",s[b[i-1]].x,s[b[i-1]].y,s[b[i]].x,s[b[i]].y,
sqrt((s[b[i]].x-s[b[i-1]].x)*(s[b[i]].x-s[b[i-1]].x)+(s[b[i]].y-s[b[i-1]].y)*(s[b[i]].y-s[b[i-1]].y))+16);
}
printf("Number of feet of cable required is %.2lf.\n",lenmin);
}
return 0;
}