Cod sursa(job #143782)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 26 februarie 2008 20:59:56
Problema Bibel Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <stdio.h>
#include <math.h>
#include <string.h>

#define mare 1000000000

long num, v[32], q1[32], w1[32], n, q2[32], w2[32], c[131072][18], dpn, rez, i, j, x, k, j2, k2;

void copy() {
	memcpy(q1, q2, sizeof(q1));
	memcpy(w1, w2, sizeof(w1));
}

void afla1() {
	while (1) {
		scanf("%ld", &x);
		if (x == 1) break;
		++n;
		scanf("%ld %ld", &q2[n], &w2[n]);
	}
}

long MIN(long a, long b) { 
	if (a < b) {
		return a;
	}
	return b;
}

void afla2() {
	dpn = 1 << n;
	for (i = 1; i < dpn; i++) {
		for (j = 1, k = 1; j <= i; j <<= 1, ++k) {
			if (j & i) {
				c[i][k] = mare;
				if (j == i) {
					for (j2 = 1; j2 <= num; ++j2) {
						c[i][k] = MIN(c[i][k], (long)(v[j2] + (q2[k] - q1[j2]) * (q2[k] - q1[j2]) + (w2[k] - w1[j2]) * (w2[k] - w1[j2])));
					}
				} else {
					for (j2 = 1, k2 = 1; j2 <= i; j2 <<= 1, ++k2) {
						if ((j2 & i) && j2 != j) {
							c[i][k] = MIN(c[i][k], c[i ^ j][k2] + (q2[k] - q2[k2]) * (q2[k] - q2[k2]) + (w2[k] - w2[k2]) * (w2[k] - w2[k2]));
						}
					}
				}
			}
		}
	}
}

int main() {
	freopen("bibel.in", "r", stdin);
	freopen("bibel.out", "w", stdout);

	for (i = 1; i < 20; i++) {
		v[i] = mare;
	}
	v[1] = 0;
	num = 1;

	while (1) {
		scanf("%ld", &x);
		if (x == 2) {
			break;
		}
		n = 1;
		scanf("%ld %ld", &q2[1], &w2[1]);
		afla1();
		afla2();
		num = n;
		copy();
		rez = mare;
		for (i = 1; i <= n; ++i) {
			v[i] = c[dpn - 1][i];
			if (v[i] < rez) {
				rez = v[i];
			}
		}
		printf("%ld \n", rez);
	}
	return 0;
}