Getting in Line UVA, 216

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node
{
    int x;
    int y;
}node[10];
struct Ans
{
    double goal;
    int i;
}ans[41000]; //i为全排列中的编号,goal为得到的结果,用编号来获得全排列中对应的序列
bool cmp(const Ans a,const Ans b)
{
    return a.goal<b.goal;
}
int a[10];
int main()
{
    int tol=0;
    int n;
    double sum;
    int tol1;
    while(scanf("%d",&n)==1&&n)
    {
         tol1=0;
         sum=0;
         for(int i=1;i<=n;i++)
            scanf("%d%d",&node[i].x,&node[i].y);
         if(n==1)
            {printf("**********************************************************\nNetwork #%d\n",++tol);
              printf("Number of feet of cable required is 0.00.\n");
                    continue;}
         for(int i=0;i<n;i++)
            a[i]=i+1;
         double  k;
         for(int i=0;i<n-1;i++)
         {
             k=sqrt(pow(node[a[i]].x-node[a[i+1]].x,2)+pow(node[a[i]].y-node[a[i+1]].y,2));
            // printf("%.2f",k);
             sum+=k;
         }
         //printf("%.2f\n",sum);
        ans[tol1].goal=sum;
        ans[tol1].i=tol1+1;
        tol1++;  //
         while(next_permutation(a,a+n))
         {
             sum=0;
             for(int i=0;i<n-1;i++)
                {
                k=sqrt((pow(node[a[i]].x-node[a[i+1]].x,2)+pow(node[a[i]].y-node[a[i+1]].y,2)));
                sum+=k;
                }
            ans[tol1].goal=sum;
            ans[tol1].i=tol1+1;
            tol1++;
         }
         printf("**********************************************************\nNetwork #%d\n",++tol);
         sort(ans,ans+tol1,cmp);
         for(int i=0;i<n;i++)
             a[i]=i+1;
         if(ans[0].i==1)
            for(int j=0;j<n-1;j++)
            {
                double r=sqrt((pow(node[a[j]].x-node[a[j+1]].x,2)+pow(node[a[j]].y-node[a[j+1]].y,2)));
                printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2f feet.\n",node[a[j]].x,node[a[j]].y,node[a[j+1]].x,node[a[j+1]].y,r+16);
            }


        else
        {
            int k1=1;
         while(next_permutation(a,a+n))
        {
            k1++;
            if(ans[0].i==k1)break;
        }


        for(int j=0;j<n-1;j++)
        {
            double r=sqrt((pow(node[a[j]].x-node[a[j+1]].x,2)+pow(node[a[j]].y-node[a[j+1]].y,2)));
            printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2f feet.\n",node[a[j]].x,node[a[j]].y,node[a[j+1]].x,node[a[j+1]].y,r+16);
        }


        }
        printf("Number of feet of cable required is %.2f.\n",ans[0].goal+16*(n-1));
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值