Cod sursa(job #636918)

Utilizator sebii_cSebastian Claici sebii_c Data 20 noiembrie 2011 01:56:56
Problema Portal3 Scor 0
Compilator c Status done
Runda .com 2011 Marime 1.76 kb
#include <stdio.h>

inline int abs(int a)
{
	return (a < 0) ? -a : a;
}

struct portal {
	int x1, x2;
	int y1, y2;
	int cost;
} v[4];

int main()
{
	freopen("portal3.in", "r", stdin);
	freopen("portal3.out", "w", stdout);
	int T, m, n, i, j, k;	
	long long res;
	scanf("%d", &T);
	for ( ; T; --T) {
		scanf("%d %d", &n, &m);

		for (i = 0; i < 3; ++i)
			scanf("%d %d %d %d %d", &v[i].x1, &v[i].y1, &v[i].x2, &v[i].y2, &v[i].cost);
		int min = m + n;

		for (i = 0; i < 3; ++i) {
			res = v[i].x1 + v[i].y1 + n - v[i].x2 + m - v[i].y2 + v[i].cost;
			if (res < min)
				min = res;
		}

		for (i = 0; i < 3; ++i)
			for (j = i + 1; j < 3; ++j) {
				res = v[i].x1 + v[i].y1 + abs(v[j].x1 - v[i].x2) + abs(v[j].y1 - v[i].y2) + 
					n - v[j].x2 + m - v[j].y2 + v[i].cost + v[j].cost;
				if (res < min)
					min = res;
				res = v[j].x1 + v[j].y1 + abs(v[j].x1 - v[i].x2) + abs(v[i].y1 - v[j].y2) + 
					n - v[i].x2 + m - v[i].y2 + v[j].cost + v[i].cost;
				if (res < min)
					min = res;
			}

		for (i = 0; i < 3; ++i)
			for (j = i + 1; j < 3; ++j) {
				if (j == 1) k = 2;
				else if (j == 2 && i == 0) k = 1;
				else if (j == 2 && i == 1) k = 0;
				res = v[i].x1 + v[i].y1 + abs(v[j].x1 - v[i].x2) + abs(v[j].y1 - v[i].y2) + abs(v[k].x1 - v[j].x2)
					+ abs(v[k].y1 - v[j].y2) + n - v[k].x2 + m - v[k].y2 + v[i].cost + v[j].cost + v[k].cost;
				if (res < min)
					min = res;	
			}
		for (j = 0; j < 2; ++j)
			for (k = j + 1; k >= 0; --k) {
				res = v[2].x1 + v[2].y1 + abs(v[j].x1 - v[2].x2) + abs(v[j].y1 - v[2].y2) + abs(v[k].x1 - v[j].x2)
						+ abs(v[k].y1 - v[j].y2) + n - v[k].x2 + m - v[k].y2 + v[2].cost + v[j].cost + v[k].cost;
				if (res < min)
					min = res;
			}
		printf("%d\n", min);
	}

	return 0;
}