Cod sursa(job #635536)

Utilizator FlorianFlorian Marcu Florian Data 19 noiembrie 2011 12:55:13
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 1.23 kb
using namespace std;
#include<fstream>
#include<cstring>
int N, M;
int Dx[4], Dy[4];
int Sx[4], Sy[4], C[4];
int sol = -1, st[4], viz[4], K, state;
inline int abs( int a, int b ) { return a>b?a-b:b-a; }
void solve()
{
	int x = 0, y = 0, cst = 0;
	for( int i = 1; i <= K; ++i )
	{
		if( state & ( 1 << (i-1) ) )
		{
			cst += abs( x - Dx[st[i]] ) + abs( y - Dy[st[i]] );
			cst += C[st[i]];
			x = Sx[st[i]]; y = Sy[st[i]];
		}
		else
		{
			cst += abs( x - Sx[st[i]] ) + abs( y - Sy[st[i]] );
			cst += C[st[i]];
			x = Dx[st[i]]; y = Dy[st[i]];
		}
	}
	cst += abs( N - x ) + abs( M - y );
	if( sol == -1 || sol > cst ) sol = cst;
}
void aranj( int k )
{
	if( k == K + 1 )
	{
		for(int i = 0; i < (1<<K); ++i) 
		{
			state = i;
			solve();
		}
	}
	else
		for(int i = 1; i <= 3; ++i)
			if( !viz[i] )
			{
				st[k] = i;
				viz[i] = 1;
				aranj(k+1);
				viz[i] = 0;
			}
}
int main()
{
	ifstream in("portal3.in"); ofstream out("portal3.out");
	int T;
	in >> T;
	for(;T;--T)
	{
		in >> N >> M;
		for(int i = 1; i <= 3; ++i)
			in >> Sx[i] >> Sy[i] >> Dx[i] >> Dy[i] >> C[i];
		sol = -1;
		for(int i = 1; i <= 3; ++i)
		{
			K = i;
			aranj(1);
		}
		out << sol << "\n";
	}
	return 0;
}