Cod sursa(job #711307)

Utilizator danalex97Dan H Alexandru danalex97 Data 11 martie 2012 21:16:40
Problema Portal3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <cstdio>
#include <string>
#include <fstream>

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];

	for ( i=0;i<=9;++i) 
		for (int j=1;j<=5;++j)
		{
			now[i].d=0;
			now[i].x0.x=0;
			now[i].x0.y=0;
			now[i].x1.x=0;
			now[i].x1.y=0;
		}
    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 --)
    {
		for ( i=0;i<=3;++i) f[i]=0;
		for ( i=0;i<=4;++i) st[i]=0;
        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;
}