Cod sursa(job #638019)

Utilizator rootsroots1 roots Data 20 noiembrie 2011 18:11:55
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 4.36 kb
#include <fstream>

using namespace std;

ifstream in;
ofstream out;

inline int abs(int x)
{
    if(x<0) x*=-1;
    return x;
}

int x[7],y[7],c[4];
int sol[4];
int d,M,N;

inline void verif()
{
    int px,py;
    int p,dist;

    int ok=0;
    for(int i=1;i<=3;++i)
        if(sol[i]!=0) ++ok;

    if(ok==1)
    {
    px=py=dist=0;
    for(int i=1;i<=3;++i)
        if(sol[i]!=0)
        {
            p=(i-1)*2;
            p+=sol[i];

            dist+=abs(px-x[p])+abs(py-y[p]);
            dist+=c[i];

            if(p%2==0) --p;
            else ++p;

            px=x[p];
            py=y[p];
        }
    dist+=abs(M-px)+abs(N-py);
    if(dist<d) d=dist;
    }

    if(ok==2)
    {
    px=py=dist=0;
    for(int i=1;i<=3;++i)
        if(sol[i]!=0)
        {
            p=(i-1)*2;
            p+=sol[i];

            dist+=abs(px-x[p])+abs(py-y[p]);
            dist+=c[i];

            if(p%2==0) --p;
            else ++p;

            px=x[p];
            py=y[p];
        }
    dist+=abs(M-px)+abs(N-py);
    if(dist<d) d=dist;

    px=py=dist=0;
    for(int i=3;i>=1;--i)
        if(sol[i]!=0)
        {
            p=(i-1)*2;
            p+=sol[i];

            dist+=abs(px-x[p])+abs(py-y[p]);
            dist+=c[i];

            if(p%2==0) --p;
            else ++p;

            px=x[p];
            py=y[p];
        }
    dist+=abs(M-px)+abs(N-py);
    if(dist<d) d=dist;
    }

    if(ok==3)
    {
    px=py=dist=0;
    for(int i=1;i<=3;++i)
        if(sol[i]!=0)
        {
            p=(i-1)*2;
            p+=sol[i];

            dist+=abs(px-x[p])+abs(py-y[p]);
            dist+=c[i];

            if(p%2==0) --p;
            else ++p;

            px=x[p];
            py=y[p];
        }
    dist+=abs(M-px)+abs(N-py);
    if(dist<d) d=dist;

    px=py=dist=0;
    for(int i=2;i<=1;++i)
    {
        if(i==4) i=1;
        if(sol[i]!=0)
        {
            p=(i-1)*2;
            p+=sol[i];

            dist+=abs(px-x[p])+abs(py-y[p]);
            dist+=c[i];

            if(p%2==0) --p;
            else ++p;

            px=x[p];
            py=y[p];
        }
    }
    dist+=abs(M-px)+abs(N-py);
    if(dist<d) d=dist;

    px=py=dist=0;
    for(int i=3;i<=2;++i)
    {
        if(i==4) i=1;
        if(sol[i]!=0)
        {
            p=(i-1)*2;
            p+=sol[i];

            dist+=abs(px-x[p])+abs(py-y[p]);
            dist+=c[i];

            if(p%2==0) --p;
            else ++p;

            px=x[p];
            py=y[p];
        }
    }
    dist+=abs(M-px)+abs(N-py);
    if(dist<d) d=dist;

    px=py=dist=0;
    for(int i=3;i>=1;--i)
        if(sol[i]!=0)
        {
            p=(i-1)*2;
            p+=sol[i];

            dist+=abs(px-x[p])+abs(py-y[p]);
            dist+=c[i];

            if(p%2==0) --p;
            else ++p;

            px=x[p];
            py=y[p];
        }
    dist+=abs(M-px)+abs(N-py);
    if(dist<d) d=dist;

    px=py=dist=0;
    for(int i=2;i>=3;--i)
    {
        if(i==0) i=3;
        if(sol[i]!=0)
        {
            p=(i-1)*2;
            p+=sol[i];

            dist+=abs(px-x[p])+abs(py-y[p]);
            dist+=c[i];

            if(p%2==0) --p;
            else ++p;

            px=x[p];
            py=y[p];
        }
    }
    dist+=abs(M-px)+abs(N-py);
    if(dist<d) d=dist;

    px=py=dist=0;
    for(int i=1;i>=2;--i)
    {
        if(i==0) i=3;
        if(sol[i]!=0)
        {
            p=(i-1)*2;
            p+=sol[i];

            dist+=abs(px-x[p])+abs(py-y[p]);
            dist+=c[i];

            if(p%2==0) --p;
            else ++p;

            px=x[p];
            py=y[p];
        }
    }
    dist+=abs(M-px)+abs(N-py);
    if(dist<d) d=dist;
    }
}

inline void back(int k)
{
    if(k>3) verif();
    else
        for(int i=0;i<=2;++i)
        {
            sol[k]=i;
            back(k+1);
        }
}

int main()
{
    int Test;

    in.open("portal3.in");
    out.open("portal3.out");

    in>>Test;

    for(;Test--;)
    {
        in>>M>>N;
        in>>x[1]>>y[1]>>x[2]>>y[2]>>c[1];
        in>>x[3]>>y[3]>>x[4]>>y[4]>>c[2];
        in>>x[5]>>y[5]>>x[6]>>y[6]>>c[3];

        d=M+N+1;
        back(1);

        out<<d<<'\n';
    }

    in.close();
    out.close();

    return 0;
}