Cod sursa(job #641510)

Utilizator c_adelinaCristescu Adelina c_adelina Data 28 noiembrie 2011 17:49:30
Problema Portal3 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>
int abs(int x)
{return (x<0)?-x:x;}

int main()
{
	int t,n,m,x[7],y[7],c[4],i,j,dist[7];
	
	freopen("portal3.in","r",stdin);
	freopen("portal3.out","w",stdout);
	scanf("%d",&t);
	while (t--)
	{
		scanf("%d %d",&n,&m);
		for (i=0;i<3;++i)
		{
			scanf("%d %d %d %d %d",&x[i*2],&y[i*2],&x[i*2+1],&y[i*2+1],&c[i]);
			dist[i*2]=x[i*2]+y[i*2];	dist[i*2+1]=x[i*2+1]+y[i*2+1];
			if (dist[i*2]+c[i]<dist[i*2+1])
				dist[i*2+1]=dist[i*2]+c[i]; else
					if (dist[i*2+1]+c[i]<dist[i*2])
						dist[i*2]=dist[i*2+1]+c[i]; 
		}
		x[6]=n;y[6]=m;dist[6]=n+m;
		for (i=0;i<6;++i)
			for (j=i+1;j<7;++j)
				{if ((i/2!=j/2) && (dist[i]+abs(x[i]-x[j])+abs(y[i]-y[j])<dist[j]))
					dist[j]=dist[i]+abs(x[i]-x[j])+abs(y[i]-y[j]);
				 if ((j%2==0) && (dist[j]+c[j/2]<dist[j+1]))
				 dist[j+1]=dist[j]+c[j/2]; else
					 if ((j%2==1) && (dist[j]+c[j/2]<dist[j-1]))
						 dist[j-1]=dist[j]+c[j/2];
				}
			
				 
		printf("%d\n",dist[6]);
	}
return 0;
}