Cod sursa(job #640428)

Utilizator loginLogin Iustin Anca login Data 25 noiembrie 2011 18:17:10
Problema Portal3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
# include <fstream>
# define min(a,b) (a<b?a:b)
# define ll long long
using namespace std;
ll n, m, x[10], y[10], c[5], sol, w[10], v[10];

inline int comp(int i)
{
	if (i==1)return 2;
	if (i==2)return 1;
	if (i==3)return 4;
	if (i==4)return 3;
	if (i==5)return 6;
	return 5;
}

inline ll abs (ll x)
{
	if (x<0)return -x;
	return x;
}

void calc (int k)
{
	ll d=x[w[1]]+y[w[1]]+n-x[w[k]]+m-y[w[k]];
	for(int i=1;i<=k;++i)
	{
		if (w[i]%2==0)
			d+=c[w[i]/2];
		if (i%2==0 && i<k)
			d+=abs(x[w[i]]-x[w[i+1]])+abs(y[w[i]]-y[w[i+1]]);
	}
	sol=min(sol,d);
}

void bk (int k)
{
	for(int i=1;i<7;++i)
		if (!v[i])
		{
			w[k]=i;
			w[k+1]=comp(i);
			calc(k+1);
			if (k<5)
			{
				v[i]=1;
				v[w[k+1]]=1;
				bk(k+2);
				v[i]=0;
				v[w[k+1]]=0;
			}
		}
}

int main ()
{
	ifstream fin ("portal3.in");
	freopen("portal3.out", "w", stdout);
	int t;
	fin>>t;
	for(;t--;)
	{
		fin>>n>>m;
		for(int i=1;i<4;++i)
			fin>>x[2*i-1]>>y[2*i-1]>>x[2*i]>>y[2*i]>>c[i];
		sol=n+m;
		bk(1);
		printf("%d\n", sol);
	}
	return 0;
}