Cod sursa(job #635499)

Utilizator ProtomanAndrei Purice Protoman Data 19 noiembrie 2011 12:19:31
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 1.38 kb
#include <algorithm>
#include <stdio.h>
#include <iostream>
#include <fstream>

#define ll long long

using namespace std;

struct portal
{
	ll x1, y1, x2, y2, c;
};
ll n, m, sol;
portal x[8];
ll p[8], sel[8];

ll dist(ll x1, ll y1, ll x2, ll y2)
{
	return abs(x1 - x2) + abs(y1 - y2);
}

void perm(ll level, int conf)
{
	if (level == 3)
	{
		ll xa = 0, ya = 0, pasi = 0;
		for (int i = 0; i < 3; i++)
		{
			pasi += dist(xa, ya, x[p[i] + 3 * bool(conf & (1 << i))].x1, x[p[i] + 3 * bool(conf & (1 << i))].y1) + x[p[i]].c;
			xa = x[p[i] + 3 * bool(conf & (1 << i))].x2;
			ya = x[p[i] + 3 * bool(conf & (1 << i))].y2;

			sol = min(sol, pasi + dist(xa, ya, n, m));
		}

		return;
	}

	for (int i = 1; i <= 3; i++)
		if (!sel[i])
		{
			sel[i] = 1;

			p[level] = i - 1;
			perm(level + 1, conf);

			sel[i] = 0;
		}
}
				
int main()
{
	ifstream cin("portal3.in");
	ofstream cout("portal3.out");

	int testCases;
	for (cin >> testCases; testCases; testCases--)
	{
		cin >> n >> m;
		sol = dist(0, 0, n, m);

		for (int i = 0; i < 3; i++)
		{
			cin >> x[i].x1 >> x[i].y1 >> x[i].x2 >> x[i].y2 >> x[i].c;

			x[i + 3].x1 = x[i].x2, x[i + 3].y1 = x[i].y2;
			x[i + 3].x2 = x[i].x1, x[i + 3].y2 = x[i].y1;
			x[i + 3].c = x[i].c;
		}

		for (int conf = 0; conf < (1 << 3); conf++)
			perm(0, conf);

		cout << sol;
	}

	return 0;
}