Nu aveti permisiuni pentru a descarca fisierul grader_test7.in

Cod sursa(job #152284)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 9 martie 2008 12:19:59
Problema Bibel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<cstdio>   
#include<string.h>   
#define pow(x) (1u<<(x))   
#define sqr(x) ((x)*(x))   
int x[20],y[20],px[20],py[20],plus[20],n,nrpos;   
int sol[1<<17][17], dist[17][32];   
inline void improve(unsigned m){   
       #define W(j) if (!(m & pow(j)) && sol[m][i]+dist[i][j]<sol[m+pow(j)][j]) \   
                     sol[m+pow(j)][j] = sol[m][i]+dist[i][j];   
       for (unsigned i=0; i<17; i++)   
           if (m & pow(i)){   
              W(0) W(1) W(2) W(3) W(4) W(5) W(6) W(7) W(8) W(9) W(10)   
              W(10) W(11) W(12) W(13) W(14) W(15) W(16)   
            }   
}   
void solve(){   
	memset(sol,0x7f,(17*4)<<n);   
	for (int i=0;i<n;i++)   
		for (int j=0;j<n;j++)   
			dist[i][j]=(sqr(x[i]-x[j]) + sqr(y[i]-y[j]));   
	for (int i=0; i<n; i++)   
		for (int j=0; j<nrpos; j++)   
			if (sqr(x[i]-px[j])+sqr(y[i]-py[j])+plus[j] < sol[pow(i)][i])   
				sol[pow(i)][i] = sqr(x[i]-px[j])+sqr(y[i]-py[j])+plus[j];   
	int last = (1<<n)-1;   
	for (int m=1; m<last; m++)
		improve(m);   
	nrpos = n;   
	int min=sol[last][0];   
	for (int i=0; i<n; i++){   
		if (sol[last][i] < min)
			min = sol[last][i];   
			px[i]=x[i], py[i]=y[i], plus[i] = sol[last][i];   
	}   
	printf("%d\n", min);   
	n=0;   
}   
int main(){   
    freopen("bibel.in", "r", stdin);   
    freopen("bibel.out", "w", stdout);   
    nrpos=1;   
    while(1){   
		int op;   
		scanf("%d", &op);   
		if(op==0)
			scanf("%d %d", x+n, y+n), n++;
		else  
			if(op==1)
				solve();
		else
			return 0;   
    }   
}