Cod sursa(job #638500)

Utilizator SpiderManSimoiu Robert SpiderMan Data 20 noiembrie 2011 21:54:32
Problema Portal3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
# include <algorithm>
# include <cstdio>
# include <cstring>

typedef long long ll;
const char *FIN = "portal3.in", *FOU = "portal3.out";
const int MAX = 10;

struct vec {
    int x1, y1, c;
} ;

vec E[MAX][2];
int N, M, T, S[MAX];
ll min;
bool V[MAX];

void solve (int P) {
    int x = 0, y = 0;
    ll nr = 0;
    for (int i = 1; i <= P; ++i) {
        int poz = (S[i] - 1) >> 1, rest = (S[i] - 1) & 1;
        int x1 = E[poz][rest].x1, y1 = E[poz][rest].y1;
        nr += (ll) (abs (x1 - x) + abs (y1 - y) + E[poz][0].c);
        x = E[poz][rest ^ 1].x1, y = E[poz][rest ^ 1].y1;
    }
    if (min > (nr += (ll) (abs (x - N) + abs (y - M)))) min = nr;
}

void back (int N, int P, int K) {
    if (K != 0)
        solve (K);
    if (K < P)
        for (int i = 1; i <= N; ++i)
            if (V[i] == 0)
                V[i] = 1, S[K + 1] = i, back (N, P, K + 1), V[i] = 0;
}

int main (void) {
    freopen (FIN, "r", stdin);
    freopen (FOU, "w", stdout);

    for (scanf ("%d", &T); T; --T) {
        scanf ("%d %d", &N, &M);
        for (int i = 0; i < 3; ++i)
            scanf ("%d %d %d %d %d", &E[i][0].x1, &E[i][0].y1, &E[i][1].x1, &E[i][1].y1, &E[i][0].c);
        min = N + M, back (6, 3, 0);
        printf ("%lld\n", min);
        memset (V, 0, sizeof (V)), memset (S, 0, sizeof (S));
    }
}