Cod sursa(job #999367)

Utilizator florin.elfusFlorin Elfus florin.elfus Data 19 septembrie 2013 23:36:35
Problema Portal3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <stdio.h>
#include <string.h>

struct pos
{
    long long x, y;
};

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

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

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

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

void solve (int k)
{
    int i, mask, lim, lastx = 0, lasty = 0;
    long long time = 0;
    portal now[10];

    memset (now, 0, sizeof (now));
    lim = 1 << k;

    for (i = 1; i <= k; i ++)
        now[i] = x[st[i]];
    for (mask = 0; mask < lim; mask ++)
    {
        time = 0; lastx = 0; lasty = 0;
        for (i = 1; i <= k; i ++)
            if ((mask & (1 << (i - 1))) == 0)
            {
                time = time + dist (lastx, lasty, now[i].x0.x, now[i].x0.y) + now[i].d;
                lastx = now[i].x1.x; lasty = now[i].x1.y;
            }
            else
            {
                time = time + dist (lastx, lasty, now[i].x1.x, now[i].x1.y) + now[i].d;
                lastx = now[i].x0.x; lasty = now[i].x0.y;
            }
        time = time + dist (lastx, lasty, N, M);
        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 ("%lld%lld", &N, &M);
        for (i = 1; i <= 3; i ++)
            scanf ("%lld%lld%lld%lld%lld", &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 ("%lld\n", min);
    }

    return 0;
}