1、回溯法。。。没有什么难度,注意题目要求的单位是feet,在求了距离后要加上16才行。一次AC~
#include<cstdio>
#include<cstring>
#include<cmath>
struct point{
int x,y;
};
int n,vis[10],answer[10],s[10];
double dis[10][10],min;
void dfs(int num){
double ans=0.0;
if(num==n) {
for(int i=0;i<n-1;i++)
ans+=dis[s[i]][s[i+1]];
if(ans<min) {
min=ans;
for(int i=0;i<n;i++)
answer[i]=s[i];
}
return;
}
for(int i=0;i<n;i++)
if(!vis[i]){
vis[i]=1;
s[num]=i;
dfs(num+1);
vis[i]=0;
}
return;
}
int main(){
//freopen("a.txt","r",stdin);
point a[10];
int kase=0;
while(scanf("%d",&n)==1&&n){
memset(dis,0.0,sizeof(dis));
min=100000000000000;
for(int i=0;i<n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
dis[i][j]=16+sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));
for(int i=0;i<n;i++){
memset(vis,0,sizeof(vis));
vis[i]=1;
s[0]=i;
dfs(1);
}
printf("**********************************************************\n");
printf("Network #%d\n",++kase);
for(int i=0;i<n-1;i++)
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n",
a[answer[i]].x,a[answer[i]].y,a[answer[i+1]].x,a[answer[i+1]].y,dis[answer[i]][answer[i+1]]);
printf("Number of feet of cable required is %.2lf.\n",min);
}
return 0;
}