Cod sursa(job #638032)

Utilizator maritimCristian Lambru maritim Data 20 noiembrie 2011 18:17:55
Problema Portal3 Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 1.32 kb
#include<stdio.h>

#define MaxN 100
#define MaxP 3
#define ll long long

typedef struct
{
	ll x,y;
} xy;

ll T,N,M,C[MaxN],V[MaxN],viz[MaxN];
xy A[MaxN][MaxP];
ll MIN;

ll min(ll a,ll b)
{
	return a<b ? a:b;
}

ll Dist(ll a,ll b)
{
	if(a > b)
		return a-b;
	return b-a;
}

void BackSubm(int k,ll D,int nr,int p)
{
	if(k == p+1)
	{
		if(D < MIN)
			MIN = D;
		return ;	
	}
	BackSubm(k+1,D+Dist(A[V[k]][0].x,A[V[k-1]][nr].x)+Dist(A[V[k]][0].y,A[V[k-1]][nr].y)+C[V[k]],1,p);
	BackSubm(k+1,D+Dist(A[V[k]][1].x,A[V[k-1]][nr].x)+Dist(A[V[k]][1].y,A[V[k-1]][nr].y)+C[V[k]],0,p);
}

void BackAranj(int k,int p)
{
	if(k == p+1)
	{
		V[k] = 4;
		BackSubm(1,0,0,p+1);
		return ;
	}
	for(int i=1;i<=3;i++)
		if(!viz[i])
		{
			V[k] = i;
			viz[i] = 1;
			BackAranj(k+1,p);
			viz[i] = 0;
		}
}

int main()
{
	FILE *f = fopen("portal3.in","r");
	FILE *g = fopen("portal3.out","w");
	
	fscanf(f,"%lld",&T);
	for(int i=1;i<=T;i++)
	{
		MIN = 1LL*200*10000*1000000;
		fscanf(f,"%lld %lld",&N,&M);
		A[4][0].x = A[4][1].x = N;
		A[4][0].y = A[4][1].y = M;
		for(int j=1;j<=3;j++)
			fscanf(f,"%lld %lld %lld %lld %lld",&A[j][0].x,&A[j][0].y,&A[j][1].x,&A[j][1].y,&C[j]);
		for(int j=1;j<=3;j++)
			BackAranj(1,j);
		fprintf(g,"%lld\n",min(MIN,N+M));
	}
	
	fclose(g);
	fclose(f);
	return 0;
}