Cod sursa(job #637946)

Utilizator rootsroots1 roots Data 20 noiembrie 2011 17:42:50
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 1.61 kb
#include <fstream>
#include <cstring>

#define q long long

using namespace std;

ifstream in;
ofstream out;

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

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

inline void verif()
{
    q px=0,py=0;
    q p,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];
        }

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

            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>6) 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--;)
    {
        memset(x,0,sizeof(x));
        memset(sol,0,sizeof(sol));
        memset(y,0,sizeof(y));
        memset(c,0,sizeof(c));

        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;
        back(1);

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

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

    return 0;
}