Cod sursa(job #613625)

Utilizator cezar305Mr. Noname cezar305 Data 1 octombrie 2011 19:09:00
Problema Portal3 Scor Ascuns
Compilator cpp Status done
Runda Marime 1.7 kb
#include <stdio.h>
#include <string.h>

struct portal
{
	int x1, y1, x2, y2, c;
};

int n, m, t;
int sol[10][10];
portal v[5];

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

int main ()
{
	freopen ("portal3.in", "r", stdin);
	freopen ("portal3.out", "w", stdout);
	
	scanf ("%d", &t);
	while (t --)
	{
		memset (sol, 0, sizeof (sol));
		
		scanf ("%d %d", &n, &m);
		
		sol[1][8] = sol[8][1] = n + m;
		
		int i, j, k;
		
		for (i = 1; i <= 3; i ++)
		{
			scanf ("%d %d %d %d %d", &v[i].x1, &v[i].y1, &v[i].x2, &v[i].y2, &v[i].c);
			if (v[i].c > abs (v[i].x1 - v[i].x2) + abs (v[i].y1 - v[i].y2))
				v[i].c = abs (v[i].x1 - v[i].x2) + abs (v[i].y1 - v[i].y2);
			
			sol[1][2 * i] = sol[2 * i][1] = v[i].x1 + v[i].y1;
			sol[1][2 * i + 1] = sol[2 * i + 1][1] = v[i].x2 + v[i].y2;
			sol[8][2 * i] = sol[2 * i][8] = n + m - v[i].x1 - v[i].y1;
			sol[8][2 * i + 1] = sol[2 * i + 1][8] = n + m - v[i].x2 - v[i].y2;
			sol[2 * i][2 * i + 1] = sol[2 * i + 1][2 * i] = v[i].c;
		}
		
		for (i = 1; i <= 3; i ++)
			for (j = 1; j <= 3; j ++)
				if (i != j)
				{
					sol[2 * i][2 * j] = abs (v[i].x1 - v[j].x1) + abs (v[i].y1 - v[j].y1);
					sol[2 * i][2 * j + 1] = abs (v[i].x1 - v[j].x2) + abs (v[i].y1 - v[j].y2);
					sol[2 * i + 1][2 * j] = abs (v[i].x2 - v[j].x1) + abs (v[i].y2 - v[j].y1);
					sol[2 * i + 1][2 * j + 1] = abs (v[i].x2 - v[j].x2) + abs (v[i].y2 - v[j].y2);
				}
		
		for (k = 1; k <= 8; k ++)
			for (i = 1; i <= 8; i ++)
				for (j = 1; j <= 8; j ++)
					if (i != k && k != j && i != j)
						if ((long long)sol[i][j] > (long long)sol[i][k] + sol[k][j])
							sol[i][j] = sol[i][k] + sol[k][j];
		
		printf ("%d\n", sol[1][8]);
	}
	
	return 0;
}