您的位置:首页 > 其它

UVa 216 - Getting in Line

2013-05-15 20:17 405 查看
/*
方法一:完全暴力枚举
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAX = 8+2;
const double MAX_CABLE = 150*2*8;
int A[MAX];
int X[MAX];
int Y[MAX];
int n;
double min_cable;
int min_A[MAX];

double get_len(int dx, int dy)
{
return sqrt(dx*dx + dy*dy);
}

double get_cable()
{
double sum = 0;
for(int i=0; i<n-1; i++) {
int m = A[i]; int n = A[i+1];
sum += get_len(X[m]-X
, Y[m]-Y
);
}
return sum;
}

int main(void) {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int T = 0;
while(scanf("%d", &n)==1 && n!=0) {
for(int i=0; i<n; i++) {
scanf("%d%d", &X[i], &Y[i]);
}
for(int i=0; i<n; i++) {
A[i] = i;
}
min_cable = MAX_CABLE;
do{
double cable = get_cable();
if(cable < min_cable) {
min_cable = cable;
memcpy(min_A, A, sizeof(A));
}
} while(next_permutation(A, A+n));
min_cable += 16*(n-1);
printf("**********************************************************\n"
"Network #%d\n", ++T);
for(int i=0; i<n-1; i++) {
int m = min_A[i]; int n = min_A[i+1];
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n",
X[m], Y[m], X
, Y
, get_len(X[m]-X
, Y[m]-Y
)+16);
}

printf("Number of feet of cable required is %.2lf.\n", min_cable);
}
return 0;
}


/*
方法二:回溯,当前值已经大于最小值时回溯
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAX = 8+2;
const double MAX_CABLE = 150*2*8;
int A[MAX];
int X[MAX];
int Y[MAX];
int n;
double min_cable;
int min_A[MAX];
int visit[MAX];

double get_len(int dx, int dy)
{
return sqrt(dx*dx + dy*dy);
}

void dfs(int cur, double sum)
{
if(n==cur) {
if(sum < min_cable) {
min_cable = sum;
memcpy(min_A, A, sizeof(A));
}
return;
}
for(int i=0; i<n; i++) {
double temp = sum;
int ok = 1;
if(visit[i]) { ok = 0; continue;}
if(ok) {
A[cur] = i;
if(cur>0) {
int pre = A[cur-1];
temp += get_len(X[pre]-X[i], Y[pre]-Y[i]);
}
if(temp > min_cable) continue;
visit[i] = 1;
dfs(cur+1, temp);
visit[i] = 0;
}
}
}

int main(void) {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int T = 0;
while(scanf("%d", &n)==1 && n!=0) {
for(int i=0; i<n; i++) {
scanf("%d%d", &X[i], &Y[i]);
}
min_cable = MAX_CABLE;
dfs(0, 0);
min_cable += 16*(n-1);
printf("**********************************************************\n"
"Network #%d\n", ++T);
for(int i=0; i<n-1; i++) {
int m = min_A[i]; int n = min_A[i+1];
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n",
X[m], Y[m], X
, Y
, get_len(X[m]-X
, Y[m]-Y
)+16);
}

printf("Number of feet of cable required is %.2lf.\n", min_cable);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: