Cod sursa(job #638909)

Utilizator mottyMatei-Dan Epure motty Data 21 noiembrie 2011 21:33:07
Problema Portal3 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <cstdlib>
#include <cstring>

using namespace std;

ifstream in("portal3.in");
ofstream out("portal3.out");

const int N = 5;

long long n, m;
long long a[N], b[N];
long long pa[N], pb[N], pc[N];
long long c[N][N];
long long sol[N];
bool used[N];
long long best = 10000 * 1000000;

void Read()
{
	in >> n >> m;
	a[4] = n, b[4] = m;

	for (int i = 1; i <= 3; ++i)
		in >> pa[i] >> pb[i] >> a[i] >> b[i] >> pc[i];
}

void GetCosts()
{
	for (int i = 1; i <= 4; ++i)
		for (int j = 0; j <= 3; ++j)
		{
			long long v1, v2 = 10000 * 1000000;
			v1 = abs(a[i] - a[j]) + abs(b[i] - b[j]);

			if (i != 4)
				v2 = abs(pa[i] - a[j]) + abs(pb[i] - b[j]) + pc[i];

			c[j][i] = (v1<v2 ? v1:v2);
		}
}

void Check(int pos)
{
	long long rez = 0;

	for (int i = 1; i < pos; ++i)
		rez += c[sol[i-1]][sol[i]];

	if (rez < best)
		best = rez;
}

void Back(int pos)
{
	if (used[4])
	{
		Check(pos);
		return;
	}

	for (int i = 1; i <= 4; ++i)
		if (!used[i])
		{
			sol[pos] = i;
			used[i] = true;
			Back(pos+1);
			used[i] = false;
		}
}

long long Solve()
{
	best = 10000 * 1000000;
	Read();
	GetCosts();
	memset(used, 0, sizeof(used));
	Back(1);

	return best;
}

int main()
{
	int t;
	in >> t;

	while (t--)
		out << Solve() << "\n";

	return 0;
}