您的位置:首页 > 其它

UVA 216 Getting in Line

2016-07-27 20:23 423 查看

UVA-216

题意:给出若干个点,只能用一条线连接,求最小费用(?反正是距离+16.0)。

解题思路:深搜暴力枚举第i个连接的点,计算下总和。注意下输出。漏了一个 . 我WA了2次。

/*************************************************************************
> File Name: UVA-216.cpp
> Author: Narsh
>
> Created Time: 2016年07月27日 星期三 09时44分53秒
************************************************************************/

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int ans[10],temp[10],n,x[10],y[10];
double Min;
bool pd[10];
void dfs(int now, double dis) {
if (now > n) {
if (dis < Min) {
for (int i = 1; i <= n; i++)
ans[i]=temp[i];
Min=dis;
}
return ;
}
double T;
for (int i = 1; i <= n; i++)
if (pd[i]) {
pd[i]=false;
temp[now]=i;
if (now != 1)
T = sqrt((x[i]-x[temp[now-1]])*(x[i]-x[temp[now-1]])+(y[i]-y[temp[now-1]])*(y[i]-y[temp[now-1]]))+16.0;
else T=0;
dfs(now+1,dis+T);
pd[i]=true;
}
}
int main() {
int num=0;
while (scanf("%d",&n) && n) {
memset(pd,true,sizeof(pd));
for (int i = 1; i <= n; i++)
scanf("%d%d",&x[i],&y[i]);
Min=99999999.99;
dfs(1,0);
printf("**********************************************************\n");
printf("Network #%d\n",++num);
for (int i = 1; i < n; i++) {
double dis = sqrt((x[ans[i]]-x[ans[i+1]])*(x[ans[i]]-x[ans[i+1]])+(y[ans[i]]-y[ans[i+1]])*(y[ans[i]]-y[ans[i+1]]))+16.0;
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n",x[ans[i]],y[ans[i]],x[ans[i+1]],y[ans[i+1]],dis);
}
printf("Number of feet of cable required is %.2lf.\n",Min);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: