UVA 216 Getting in Line

来源:互联网 发布:mac下安装nodejs 编辑:程序博客网 时间:2024/05/17 03:31

题意就是求将n个点所连接起来的最短距离,每两个点之间的距离还需要加16。


我用的是暴力(全排列),可以用回溯法,但是回溯法我现在还没学会,等我学会了再写一遍。


据说效率更高些~


12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
#include <iostream>#include <cstdio>#include<cmath>#include<algorithm>using namespace std;int nn=1;struct point{double x;double y;}a[11];int b[11],c[11];double dis(point a,point b)  {      return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y))+16;  }int main(){    int n;    int i; while(cin>>n) {     if(n==0) break;     for(i=0;i<n;i++)     {         cin>>a[i].x>>a[i].y;         b[i]=i;     }    double min=1<<20;  do{      double l=0,sum=0;     for(i=0;i<n-1;i++)      {        l=dis(a[b[i]],a[b[i+1]]);        sum+=l;      }    if(min>sum)    {        min=sum;      for(i=0;i<n;i++)        c[i]=b[i];    }  }while(next_permutation(b,b+n)); printf("**********************************************************\n"); printf("Network #%d\n",nn++); for(i=0;i<n-1;i++)   {      double l=dis(a[c[i]],a[c[i+1]]);      printf("Cable requirement to connect (%.lf,%.lf) to (%.lf,%.lf) is %.2lf feet.\n",a[c[i]].x,a[c[i]].y,a[c[i+1]].x,a[c[i+1]].y,l);   }  printf("Number of feet of cable required is %.2lf.\n",min); }    return 0;}

原创粉丝点击