Cod sursa(job #891721)

Utilizator stephy_yoyoIonescu Stefania stephy_yoyo Data 25 februarie 2013 19:19:40
Problema Portal3 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
# include <cstdio>

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

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

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

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

    return a + b;
}

int mai_aproape (int p, int x1, int 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;
}


int cost1 ( int p, int cx, int cy, int fx, int fy)
{
    int 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]);
}

int cost2 ( int p1, int p2, int cx, int cy, int fx, int fy)
{
    int 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);
}

int cost3 ( int p1, int p2, int p3, int cx, int cy, int fx, int fy)
{
    int 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);

    int curent, mi;

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

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

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

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

        for (int a=1; a<=3; a++)
            for (int b=1; b<=3; b++)
                if (a !=b)
                    for (int 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("%d\n", mi);
    }

    return 0;
}