Cod sursa(job #638132)

Utilizator sebii_cSebastian Claici sebii_c Data 20 noiembrie 2011 19:04:12
Problema Portal3 Scor 0
Compilator c Status done
Runda .com 2011 Marime 1.33 kb
#include <stdio.h>
#include <stdlib.h>
int cost[7][7];

struct portal {
	int x1, y1;
	int x2, y2;
	int c;
} v[7];

inline int min(int a, int b)
{
	return (a < b) ? a : b;
}

int main()
{
	freopen("portal3.in", "r", stdin);
	freopen("portal3.out", "w", stdout);
	int T, i, j, k, N, M, cAux;
	scanf("%d", &T);
	for ( ; T; --T) {
		scanf("%d %d", &N, &M);
		for (i = 1; i <= 3; ++i) {
			scanf("%d %d %d %d %d", &v[2*i-1].x1, &v[2*i-1].y1, &v[2*i-1].x2, &v[2*i-1].y2, &v[2*i-1].c);
			v[2*i].x1 = v[2*i-1].x2, v[2*i].y1 = v[2*i-1].y2, v[2*i].x2 = v[2*i-1].x1, v[2*i].y2 = v[2*i-1].y1, v[2*i].c = v[2*i-1].c;
		}
	
		for (i = 1; i <= 6; ++i)
			cost[i][1] = v[i].x1 + v[i].y1 + v[i].c;
		
		for (i = 1; i <= 6; ++i)
			for (j = 2; j <= 6; ++j) {
				cAux = 1000000001;
				for (k = 1; k <= 6; ++k) {
					if (k == i)
						continue;
					if (i % 2 == 1 && k == i + 1)
						continue;
					if (i % 2 == 0 && k == i - 1)
						continue;
					cAux = min(cAux, cost[k][j - 1] + abs(v[i].x1 - v[k].x2) + abs(v[i].y1 - v[k].y2) + v[i].c);
				}
				cost[i][j] = cAux;
			}
		int costMin = N + M;
		for (i = 1; i <= 6; ++i)
			for (j = 1; j <= 6; ++j) {
				if (cost[i][j] + N - v[i].x2 + M - v[i].y2 < costMin)
					costMin = cost[i][j] + N - v[i].x2 + M - v[i].y2;
			}
		printf("%d\n", costMin + 1);
	}
	
	return 0;
}