Cod sursa(job #638749)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 21 noiembrie 2011 16:04:36
Problema Portal3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.69 kb
#include <fstream>
#include <bitset>


using namespace std;

ifstream f("portal3.in");
ofstream g("portal3.out");


struct pt {
    long long x;
    long long y;
};

long long t,ti,n,m,c12,c34,c56;
pt p1,p2,p3,p4,p5,p6;
bitset <20> fr;
long long d1,d2,d3,d4,d5,d6,d13,d14,d15,d16,d23,d24,d25,d26,d35,d36,d45,d46;

long long modul(long long z) {
    if (z>=0) return z;
    return -z;
}

long long portal1();
long long portal2( );
long long portal3( );
long long portal4( );
long long portal5( );
long long portal6( );


long long costminim( ) {
    long long cost;
    cost=n+m;
    long long v;
    d1=p1.x+p1.y;d2=p2.x+p2.y;d3=p3.x+p3.y;d4=p4.x+p4.y;d5=p5.x+p5.y;d6=p6.x+p6.y;
    d13=modul(p1.x-p3.x)+modul(p1.y-p3.y);
    d14=modul(p1.x-p4.x)+modul(p1.y-p4.y);
    d15=modul(p1.x-p5.x)+modul(p1.y-p5.y);
    d16=modul(p1.x-p6.x)+modul(p1.y-p6.y);
    d23=modul(p2.x-p3.x)+modul(p2.y-p3.y);
    d24=modul(p2.x-p4.x)+modul(p2.y-p4.y);
    d25=modul(p2.x-p5.x)+modul(p2.y-p5.y);
    d26=modul(p2.x-p6.x)+modul(p2.y-p6.y);
    d35=modul(p3.x-p5.x)+modul(p3.y-p5.y);
    d36=modul(p3.x-p6.x)+modul(p3.y-p6.y);
    d45=modul(p4.x-p5.x)+modul(p4.y-p5.y);
    d46=modul(p4.x-p6.x)+modul(p4.y-p6.y);

    fr[1]=fr[2]=1;
    v=d1+portal2()+c12;
    cost=min(cost,v);
    v=d2+portal1()+c12;
    cost=min(cost,v);
    fr[1]=fr[2]=0;

    fr[3]=fr[4]=1;
    v=d3+portal4()+c34;
    cost=min(cost,v);
    v=d4+portal3()+c34;
    cost=min(cost,v);
    fr[3]=fr[4]=0;

    fr[5]=fr[6]=1;
    v=d5+portal6()+c56;
    cost=min(cost,v);
    v=d6+portal5()+c56;
    cost=min(cost,v);
    fr[5]=fr[6]=0;

    return cost;
}

int main () {
    f >> t;
    for (ti=1;ti<=t;ti++) {
        f >> n >> m;
        f >> p1.x >> p1.y >> p2.x >> p2.y >> c12;
        f >> p3.x >> p3.y >> p4.x >> p4.y >> c34;
        f >> p5.x >> p5.y >> p6.x >> p6.y >> c56;
        g << costminim() << '\n';
    }
    f.close();g.close();
    return 0;
}



long long portal1( ) {
    long long cost;
    cost=n+m-d1;
    long long v;
    fr[1]=fr[2]=1;

    if (fr[3]==0 && fr[4]==0) {

        v=d13+portal4()+c34;
        cost=min(cost,v);

        v=d14+portal3()+c34;
        cost=min(cost,v);
    }

    if (fr[5]==0 && fr[6]==0) {

        v=d15+portal6()+c56;
        cost=min(cost,v);

        v=d16+portal5()+c56;
        cost=min(cost,v);
    }

    fr[1]=fr[2]=0;
    return cost;
}
long long portal2( ) {
    long long cost;
    cost=n+m-d2;
    long long v;
    fr[1]=fr[2]=1;

    if (fr[3]==0 && fr[4]==0) {

        v=d23+portal4()+c34;
        cost=min(cost,v);

        v=d24+portal3()+c34;
        cost=min(cost,v);
    }

    if (fr[5]==0 && fr[6]==0) {

        v=d25+portal6()+c56;
        cost=min(cost,v);

        v=d26+portal5()+c56;
        cost=min(cost,v);
    }

    fr[1]=fr[2]=0;
    return cost;
}
long long portal3( ) {
    long long cost;
    cost=n+m-d3;
    long long v;
    fr[3]=fr[4]=1;

    if (fr[1]==0 && fr[2]==0) {

        v=d13+portal2()+c12;
        cost=min(cost,v);

        v=d23+portal1()+c12;
        cost=min(cost,v);
    }

    if (fr[5]==0 && fr[6]==0) {

        v=d35+portal6()+c56;
        cost=min(cost,v);

        v=d36+portal5()+c56;
        cost=min(cost,v);
    }

    fr[3]=fr[4]=0;
    return cost;
}

long long portal4( ) {
    long long cost;
    cost=n+m-d4;
    long long v;
    fr[3]=fr[4]=1;

    if (fr[1]==0 && fr[2]==0) {

        v=d14+portal2()+c12;
        cost=min(cost,v);

        v=d24+portal1()+c12;
        cost=min(cost,v);
    }

    if (fr[5]==0 && fr[6]==0) {

        v=d45+portal6()+c56;
        cost=min(cost,v);

        v=d46+portal5()+c56;
        cost=min(cost,v);
    }

    fr[3]=fr[4]=0;
    return cost;
}


long long portal5( ) {
    long long cost;
    cost=n+m-d5;
    long long v;
    fr[5]=fr[6]=1;

    if (fr[1]==0 && fr[2]==0) {
        v=d15+portal2()+c12;
        cost=min(cost,v);

        v=d25+portal1()+c12;
        cost=min(cost,v);
    }

    if (fr[3]==0 && fr[4]==0) {
        v=d35+portal4()+c34;
        cost=min(cost,v);

        v=d45+portal3()+c34;
        cost=min(cost,v);
    }

    fr[5]=fr[6]=0;
    return cost;
}

long long portal6( ) {
    long long cost;
    cost=n+m-d6;
    long long v;
    fr[5]=fr[6]=1;

    if (fr[1]==0 && fr[2]==0) {

        v=d16+portal2()+c12;
        cost=min(cost,v);

        v=d26+portal1()+c12;
        cost=min(cost,v);
    }

    if (fr[3]==0 && fr[4]==0) {

        v=d36+portal4()+c34;
        cost=min(cost,v);

        v=d46+portal3()+c34;
        cost=min(cost,v);
    }

    fr[5]=fr[6]=0;
    return cost;

}