Cod sursa(job #634893)

Utilizator cezar305Mr. Noname cezar305 Data 17 noiembrie 2011 20:19:48
Problema Portal3 Scor Ascuns
Compilator cpp Status done
Runda Marime 2.09 kb
#include<stdio.h>
#include <iostream>
using namespace std;

#define pi pair<long long,long long>
#define x first
#define y second
#define minim(a,b) (a<b ? a : b)
#define ll long long

pi p[13];
int o[13];
ll d[13][13],sol,t,s1,s2,s3;

ll modul(ll val)
{if(val>-1) return val;else return -val;}

ll dist(pi a,pi b)
{
	return modul(a.x-b.x)+modul(a.y-b.y);
}

long long solutie ()
{
	int i,j;
	for(i=0;i<=7;i++)
		for(j=0;j<=7;j++)
			d[i][j]=dist(p[o[i]],p[o[j]]);
	long long sol;
	sol=d[0][7];
	sol=minim(sol,d[0][1]+d[2][7]+s1);
	sol=minim(sol,d[0][3]+d[4][7]+s2);
	sol=minim(sol,d[0][5]+d[6][7]+s3);
	sol=minim(sol,d[0][1]+d[2][3]+d[4][7]+s1+s2);
	sol=minim(sol,d[0][1]+d[2][5]+d[6][7]+s1+s3);
	sol=minim(sol,d[0][3]+d[4][1]+d[2][7]+s2+s1);
	sol=minim(sol,d[0][3]+d[4][5]+d[6][7]+s2+s3);
	sol=minim(sol,d[0][5]+d[6][1]+d[2][7]+s3+s1);
	sol=minim(sol,d[0][5]+d[6][3]+d[4][7]+s3+s2);
	sol=minim(sol,d[0][1]+d[2][3]+d[4][5]+d[6][7]+s1+s2+s3);
	sol=minim(sol,d[0][1]+d[2][5]+d[6][3]+d[4][7]+s1+s2+s3);
	sol=minim(sol,d[0][3]+d[4][1]+d[2][5]+d[6][7]+s1+s2+s3);
	sol=minim(sol,d[0][3]+d[4][5]+d[6][1]+d[2][7]+s1+s2+s3);
	sol=minim(sol,d[0][5]+d[6][1]+d[2][3]+d[4][7]+s1+s2+s3);
	sol=minim(sol,d[0][5]+d[6][3]+d[4][1]+d[2][7]+s1+s2+s3);
	return sol;
}

int main ()
{
	int i,j,k;

	freopen("portal3.in","r",stdin);
	freopen("portal3.out","w",stdout);

	scanf("%lld",&t);
	for(;t;t--)
	{
		scanf("%lld%lld",&p[7].x,&p[7].y);
	
		scanf("%lld%lld%lld%lld%lld\n",&p[1].x,&p[1].y,&p[2].x,&p[2].y,&s1);
		scanf("%lld%lld%lld%lld%lld\n",&p[3].x,&p[3].y,&p[4].x,&p[4].y,&s2);
		scanf("%lld%lld%lld%lld%lld\n",&p[5].x,&p[5].y,&p[6].x,&p[6].y,&s3);
	
		for (i = 0; i <= 7; i ++)
			o[i] = i;
		sol = solutie();
		for (i = 0; i < 2; i ++)
		{
			if (i)
				o[1] = 2, o[2] = 1;
			for (j = 0; j < 2; j ++)
			{
				if (j)
					o[3] = 4, o[4] = 3;
				for (k = 0; k < 2; k ++)
				{
					if (k)
						o[5] = 6, o[6] = 5;
					sol = minim (sol, solutie());
					if (k)
						o[5] = 5, o[6] = 6;
				}
				if (j)
					o[3] = 3, o[4] = 4;
			}
			if (i)
				o[1] = 1, o[2] = 2;
		}
		cout << sol << "\n";
	}
	return 0;
}