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; }
相关文章推荐
- UVa 216 Getting in Line
- UVA 216(Getting in Line)回溯
- UVA 216 - Getting in Line
- uva 216 Getting in Line 最短路,全排列暴力做法
- Uva 216 - Getting in Line
- UVa 216 Getting in Line(回溯版)
- uva-216 - Getting in Line
- uva 216 - Getting in Line
- UVa 216 Getting in Line【枚举排列】
- uva 216 Getting in Line
- UVa 216 - Getting in Line 回溯,简单递归枚举
- uva 216 Getting in Line(暴力枚举)
- uva 216 Getting in Line 最短路,全排列暴力做法
- Uva 216 - Getting in Line
- Getting in Line UVA, 216
- uva 216 - Getting in Line 带宽
- UVA 216 Getting in Line
- UVa 216 - Getting in Line
- uva - 216 - Getting in Line
- uva216 Getting in Line