Cod sursa(job #894985)

Utilizator stephy_yoyoIonescu Stefania stephy_yoyo Data 27 februarie 2013 08:49:26
Problema Portal3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
# include <cstdio>

long long t, n, m, x[7], y[7],c[4];

long long dist ( long long x1, long long y1, long long x2, long long y2)
{
    long long a, b;

    a = x1 - x2;
    if (a < 0)
        a = 0 - a;

    b = y1 - y2;
    if (b < 0)
        b = 0 - b;

    return a + b;
}

long long mai_aproape (long long p, long long x1, long long x2)
{
    if ( dist (x1, x2, x[2*p-1], y[2*p-1]) < dist( x1, x2, x[2*p], y[2*p]))
        return 2*p - 1;
    return 2*p;
}


long long cost1 ( long long p, long long cx, long long cy, long long fx, long long fy)
{
    long long pr, ult;

    pr = mai_aproape (p, cx, cy);
    if (pr%2 ==  0)
        ult = pr -1;
    else
        ult = pr +1;

    return dist(x[pr],y[pr], cx, cy) + c[p] + dist(fx, fy, x[ult], y[ult]);
}

long long cost2 ( long long p1, long long p2, long long cx, long long cy, long long fx, long long fy)
{
    long long pr, ult;

    pr = mai_aproape (p1, cx, cy);
    if (pr%2 ==  0)
        ult = pr -1;
    else
        ult = pr +1;

    return dist(cx, cy, x[pr], y[pr]) + c[p1] + cost1( p2, x[ult], y[ult], fx, fy);
}

long long cost3 ( long long p1, long long p2, long long p3, long long cx, long long cy, long long fx, long long fy)
{
    long long pr, ult;

    pr = mai_aproape (p1, cx, cy);
    if (pr%2 ==  0)
        ult = pr -1;
    else
        ult = pr +1;

    return dist(cx, cy, x[pr], y[pr]) + c[p1] + cost2( p2, p3, x[ult], y[ult], fx, fy);
}

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

    long long curent, mi;

    scanf ("%lld", &t);
    for (long long i =1; i<=t; i++)
    {
        scanf ("%lld%lld", &n,&m);
        for (long long j=1; j<=3; j++)
            scanf ("%lld%lld%lld%lld%lld", &x[2*j - 1], &y[j*2 - 1], &x[2*j], &y[2*j], &c[j]);

        mi = dist(0, 0, n, m);

        for (long long j= 1; j<=3; j++)
        {
            curent = cost1(j, 0, 0, n, m);
            if (curent < mi)
                mi = curent;
        }

        for (long long a=1; a<=3; a++)
            for (long long b=1; b<=3; b++)
                if (a != b)
                {
                    curent = cost2(a, b, 0, 0, n, m);
                    if (curent < mi)
                        mi = curent;
                }

        for (long long a=1; a<=3; a++)
            for (long long b=1; b<=3; b++)
                if (a !=b)
                    for (long long c=1; c<= 3; c++)
                        if (a !=c && b != c)
                        {
                            curent = cost3(a, b, c, 0, 0, n, m);
                            if (curent < mi)
                                mi = curent;
                        }

        printf("%lld\n", mi);
    }

    return 0;
}