Cod sursa(job #638269)

Utilizator sebii_cSebastian Claici sebii_c Data 20 noiembrie 2011 19:57:14
Problema Portal3 Scor 100
Compilator c Status done
Runda .com 2011 Marime 1.64 kb
#include <stdio.h>
#include <stdlib.h>

const int INF = 2000000100;
long long cost[4][4][4];

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

inline long long min(long long a, long long 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;
	scanf("%d", &T);
	for ( ; T; --T) {
		scanf("%d %d", &N, &M);
		for (i = 0; i < 3; ++i) 
			scanf("%d %d %d %d %lld", &v[i].x1, &v[i].y1, &v[i].x2, &v[i].y2, &v[i].c);
	
		for (i = 0; i < 3; ++i) {
			cost[0][i][0] = v[i].x1 + v[i].y1 + v[i].c;
			cost[1][i][0] = v[i].x2 + v[i].y2 + v[i].c;
		}

		for (j = 1; j < 3; ++j) {
			for (i = 0; i < 3; ++i) {
				cost[0][i][j] = cost[1][i][j] = INF;
				for (k = 0; k < 3; ++k) {
					if (k != i) {
						cost[0][i][j] = min(cost[0][i][j], v[i].c + min(cost[0][k][j - 1] + abs(v[k].x2 - v[i].x1) + abs(v[k].y2 - v[i].y1),
									cost[1][k][j - 1] + abs(v[k].x1 - v[i].x1) + abs(v[k].y1 - v[i].y1)));
						if (cost[0][i][j] > INF)
							cost[0][i][j] = INF;

						cost[1][i][j] = min(cost[1][i][j], v[i].c + min(cost[0][k][j - 1] + abs(v[k].x2 - v[i].x2) + abs(v[k].y2 - v[i].y2),
									cost[1][k][j - 1] + abs(v[k].x1 - v[i].x2) + abs(v[k].y1 - v[i].y2)));
						if (cost[1][i][j] > INF)
							cost[1][i][j] = INF;
					}
				}
			}
		}
		long long costMin = N + M;
		for (j = 0; j < 3; ++j)
			for (i = 0; i < 3; ++i) {
				costMin = min(costMin, min(cost[0][i][j] + abs(N - v[i].x2) + abs(M - v[i].y2), 
							cost[1][i][j] + abs(N - v[i].x1) + abs(M - v[i].y1)));
			}
		printf("%lld\n", costMin);
	}

	return 0;
}