Cod sursa(job #643152)

Utilizator costyv87Vlad Costin costyv87 Data 3 decembrie 2011 00:55:42
Problema Portal3 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
FILE *f,*g;
struct cp{int x1,y1,x2,y2; long long c;} v[4];
long long mn;
int T,n,m,j,i;
int st[5];

int abs(int x) {
if(x<0) return -x;
return x;
}

int ok(int k) {
for (int i=1;i<=k-1;i++) 
	if (st[i]==st[k]) 
		return 0;
return 1;
}

void tipar(int k) {
long long val=0;
int i,l=0,c=0,j;

for (j=0;j<(1<<k);j++) {
	val=0,l=0,c=0;
	for (i=1;i<=k;i++) {
		if (j & (1<<(i-1))) {
			val+=(long long)abs(l-v[st[i]].x1);
			val+=(long long)abs(c-v[st[i]].y1);
			l=v[st[i]].x2;
			c=v[st[i]].y2;
			val+=(long long)v[st[i]].c;
			}
		else {
			val+=(long long)abs(l-v[st[i]].x2);
			val+=(long long)abs(c-v[st[i]].y2);
			l=v[st[i]].x1;
			c=v[st[i]].y1;
			val+=(long long)v[st[i]].c;
			}
		}
	val+=(long long)abs(n-l);
	val+=(long long)abs(m-c);
	if (val<mn) mn=val;
	}

}

void back(int p) {
int k;

k=1; st[k]=0;
while (k>0) {
	if (st[k]<3) {
		st[k]++;
		if (ok(k)) { 
			if (k==p) 
				tipar(k);
			else {
				k++;
				st[k]=0;
				}
				
			}
		}
	else  
		k--;
	}

}

int main() {
f=fopen("portal3.in","r");
g=fopen("portal3.out","w");

fscanf(f,"%d",&T);

for (i=1;i<=T;i++) {
	fscanf(f,"%d%d",&n,&m);
	for (j=1;j<=3;j++) 
		fscanf(f,"%d%d%d%d%lld",&v[j].x1,&v[j].y1,&v[j].x2,&v[j].y2,&v[j].c);
	mn=(long long)n+m;
	for (j=1;j<=3;j++)
		back(j);
	}

fprintf(g,"%lld",mn);
fclose(g);
return 0;

}