Cod sursa(job #639493)

Utilizator geniucosOncescu Costin geniucos Data 23 noiembrie 2011 13:08:15
Problema Portal3 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<stdio.h>
using namespace std;
long long x1,y1,c,mini,n,m,t10,i1,i,k,p1[5],p2[5],q1[5],q2[5],co[5],x[5];
int abs(int q1)
{
	if(q1>=0) return q1;
	else return  q1*-1;
}
int dist(int x11,int y11,int x21,int y21)
{
	return abs(y21-y11)+abs(x21-x11);
}
int valid(int k)
{
	for(i=1;i<k;i++)
		if(x[i]==x[k]) return 0;
	return  1;
}
void back()
{
	k=1;
	x[k]=0;
	while(k>0)
	{
		while(k<=3&&x[k]<6)
		{
			x[k]++;
			if(valid(k)==1)
			{
				x1=0;
				y1=0;
				c=0;
				for(i=1;i<=k;i++)
				{
					if(x[i]<=3)
					{
						c=c+dist(x1,y1,p1[x[i]],q1[x[i]])+co[x[i]];
						x1=p2[x[i]];
						y1=q2[x[i]];
					}
					else
					if(x[i]>3)
					{
						c=c+dist(x1,y1,p2[x[i]],q2[x[i]])+co[x[i]];
						x1=p1[x[i]];
						y1=q1[x[i]];
					}
				}
				c=c+dist(x1,y1,n,m);
				if(c<mini) mini=c;
				k++;
				x[k]=0;
			}
		}
		k--;
	}
}
int main()
{
freopen("portal3.in","r",stdin);
freopen("portal3.out","w",stdout);
scanf("%d",&t10);
for(i1=1;i1<=t10;i1++)
{
	scanf("%d",&n);
	scanf("%d",&m);
	for(i=1;i<=3;i++)
	{
		scanf("%I64d",&p1[i]);
		scanf("%I64d",&q1[i]);
		scanf("%I64d",&p2[i]);
		scanf("%I64d",&q2[i]);
		scanf("%I64d",&co[i]);
	}
	mini=dist(0,0,n,m);
	back();
	printf("%I64d\n",mini);
}
return 0;
}