Cod sursa(job #636137)

Utilizator elfusFlorin Chirica elfus Data 19 noiembrie 2011 17:19:57
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 1.48 kb
#include <stdio.h>
#include <string.h>

struct pos
{
    int x, y;
};

struct portal
{
    pos x0, x1;
    int d;
} x[5];

int min, st[5], N, M, f[4];

inline int ab (int x)
{
    if (x > 0)
        return x;
    return x * (-1);
}

inline long long dist (int x0, int y0, int x1, int y1)
{
    return ab (x0 - x1) + ab (y0 - y1);
}

void solve (int k)
{
    int i;
    long long time = 0;
    portal now[10];

    memset (now, 0, sizeof (now));
    now[k + 1].x0.x = N; now[k + 1].x0.y = M;

    for (i = 1; i <= k; i ++)
        now[i] = x[st[i]];
    for (i = 0; i <= k; i ++)
        time = (long long)time + dist (now[i].x1.x, now[i].x1.y, now[i + 1].x0.x, now[i + 1].x0.y) + now[i].d;
    if (time < min)
        min = time;
}

void Back (int k)
{
    int i;

    for (i = 1; i <= 3; i ++)
        if (!f[i])
        {
            st[k] = i;
            f[i] = 1;
            solve (k);
            Back (k + 1);
            f[i] = 0;
        }
}

int main ()
{
    int T, i;

    freopen ("portal3.in", "r", stdin);
    freopen ("portal3.out", "w", stdout);

    scanf ("%d", &T);
    while (T --)
    {
        memset (st, 0, sizeof (st));
        memset (f, 0, sizeof (f));
        scanf ("%d%d", &N, &M);
        for (i = 1; i <= 3; i ++)
            scanf ("%d%d%d%d%d", &x[i].x0.x, &x[i].x0.y, &x[i].x1.x, &x[i].x1.y, &x[i].d);
        min = N + M;
        Back (1);
        printf ("%d\n", min);
    }

    return 0;
}