Cod sursa(job #637915)

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

#define MaxN 5
#define MaxP 3
#define ll long long

typedef struct
{
	ll x,y;
} xy;

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

ll max(ll a,ll b)
{
	return a>b ? a:b;
}

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

void BackSubm(int k,ll D,int nr,int p)
{
	if(k == p+1)
	{
		if(D < MIN)
			MIN = D;
		return ;	
	}
	BackSubm(k+1,D+max(A[V[k]][0].x,A[V[k-1]][nr].x)-min(A[V[k]][0].x,A[V[k-1]][nr].x)+
		max(A[V[k]][0].y,A[V[k-1]][0].y)-min(A[V[k]][0].y,A[V[k-1]][0].y)+C[V[k]],1,p);
	BackSubm(k+1,D+max(A[V[k]][1].x,A[V[k-1]][nr].x)-min(A[V[k]][1].x,A[V[k-1]][nr].x)+
		max(A[V[k]][1].y,A[V[k-1]][nr].y)-min(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,1,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,"%d",&T);
	for(int i=1;i<=T;i++)
	{
		MIN = 1LL*1000*1000*1000*1000*1000;
		fscanf(f,"%d %d",&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,"%d %d %d %d %d",&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,"%llu ",min(MIN,N+M));
	}
	
	fclose(g);
	fclose(f);
	return 0;
}