Cod sursa(job #635884)

Utilizator ChallengeMurtaza Alexandru Challenge Data 19 noiembrie 2011 15:24:49
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 2.85 kb
#include <fstream>

using namespace std;

const char InFile[]="portal3.in";
const char OutFile[]="portal3.out";
const int MaxN=8;

ifstream fin(InFile);
ofstream fout(OutFile);

int T,N,M,X1[3],Y1[3],X2[3],Y2[3],C[3];
long long sum,sol;

inline long long myabs(int x)
{
	if(x<0)
	{
		return -x;
	}
	return x;
}

inline long long dist(int X1, int Y1, int X2, int Y2)
{
	return myabs(X2-X1)+myabs(Y2-Y1);
}

bool ok;
int k=-1,v[3],b[3],j,PX1[3],PY1[3],PX2[3],PY2[3],PC[3];
void back3()
{
	++k;
	if(k==3)
	{
		for(j=0;j<3;++j)
		{
			if(b[j]==0)
			{
				PX1[j]=X1[v[j]];
				PY1[j]=Y1[v[j]];
				PX2[j]=X2[v[j]];
				PY2[j]=Y2[v[j]];
			}
			else
			{
				PX1[j]=X2[v[j]];
				PY1[j]=Y2[v[j]];
				PX2[j]=X1[v[j]];
				PY2[j]=Y1[v[j]];
			}
			PC[j]=C[v[j]];
		}
		sum=dist(0,0,PX1[0],PY1[0])+PC[0]+dist(PX2[0],PY2[0],PX1[1],PY1[1])+PC[1]+dist(PX2[1],PY2[1],PX1[2],PY1[2])+PC[2]+dist(PX2[2],PX2[2],N,M);

		sol=min(sol,sum);
	}
	else
	{
		for(register int i=0;i<3;++i)
		{
			ok=true;
			for(j=0;j<k;++j)
			{
				if(v[j]==i)
				{
					ok=false;
					break;
				}
			}
			if(ok)
			{
				v[k]=i;
				b[k]=0;
				back3();
				b[k]=1;
				back3();
			}
		}
	}
	--k;
}

void back2()
{
	++k;
	if(k==2)
	{
		for(j=0;j<2;++j)
		{
			if(b[j]==0)
			{
				PX1[j]=X1[v[j]];
				PY1[j]=Y1[v[j]];
				PX2[j]=X2[v[j]];
				PY2[j]=Y2[v[j]];
			}
			else
			{
				PX1[j]=X2[v[j]];
				PY1[j]=Y2[v[j]];
				PX2[j]=X1[v[j]];
				PY2[j]=Y1[v[j]];
			}
			PC[j]=C[v[j]];
		}
		sum=dist(0,0,PX1[0],PY1[0])+PC[0]+dist(PX2[0],PY2[0],PX1[1],PY1[1])+PC[1]+dist(PX2[1],PY2[1],N,M);

		sol=min(sol,sum);
	}
	else
	{
		for(register int i=0;i<3;++i)
		{
			ok=true;
			for(j=0;j<k;++j)
			{
				if(v[j]==i)
				{
					ok=false;
					break;
				}
			}
			if(ok)
			{
				v[k]=i;
				b[k]=0;
				back2();
				b[k]=1;
				back2();
			}
		}
	}
	--k;
}

void back1()
{
	++k;
	if(k==1)
	{
		for(j=0;j<1;++j)
		{
			if(b[j]==0)
			{
				PX1[j]=X1[v[j]];
				PY1[j]=Y1[v[j]];
				PX2[j]=X2[v[j]];
				PY2[j]=Y2[v[j]];
			}
			else
			{
				PX1[j]=X2[v[j]];
				PY1[j]=Y2[v[j]];
				PX2[j]=X1[v[j]];
				PY2[j]=Y1[v[j]];
			}
			PC[j]=C[v[j]];
		}
		sum=dist(0,0,PX1[0],PY1[0])+PC[0]+dist(PX2[0],PY2[0],N,M);

		sol=min(sol,sum);
	}
	else
	{
		for(register int i=0;i<3;++i)
		{
			ok=true;
			for(j=0;j<k;++j)
			{
				if(v[j]==i)
				{
					ok=false;
					break;
				}
			}
			if(ok)
			{
				v[k]=i;
				b[k]=0;
				back1();
				b[k]=1;
				back1();
			}
		}
	}
	--k;
}

int main()
{
	fin>>T;
	for(register int i=1;i<=T;++i)
	{
		fin>>N>>M;
		for(register int j=0;j<3;++j)
		{
			fin>>X1[j]>>Y1[j]>>X2[j]>>Y2[j]>>C[j];
		}
		sol=dist(0,0,N,M);
		back3();
		back2();
		back1();
		fout<<sol<<"\n";
	}
	fin.close();
	fout.close();
	return 0;
}