Cod sursa(job #637781)

Utilizator veleanduAlex Velea veleandu Data 20 noiembrie 2011 16:39:55
Problema Portal3 Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 2.2 kb
#include<fstream>
#include<iostream>
using namespace std;
typedef struct { long x,y; } punct;
punct P[10];
long C[5],t;
long Cost[10];
long n,m,minim,i,minim_el,el,x,l;
long V[10];
inline long abs ( long x)
{
    if ( 0<x)
        return x;
        return -x;
}
inline long min ( long a, long b)
{
    if ( a<b )
        return a;
        return b;
}
int main()
{
    ifstream in("portal3.in");
    ofstream out("portal3.out");
    in>>t;
    for ( ; t; --t)
    {

        for ( i=1; i<=7; ++i)
            V[i]=0;
        in>>n>>m;
        for ( i=1; i<=7; ++i)
            Cost[i]=n+m+5;
        for ( i=1; i<=3; ++i)
            in>>P[2*i-1].x>>P[2*i-1].y>>P[2*i].x>>P[2*i].y>>C[i];
        P[7].x=n;
        P[7].y=m;
        V[0]=1;
        minim=n+m+5;
        el=0;
        while (V[7]==0)
        {

            //cout<<el<<" "<<Cost[el]<<"\n";
            for ( i=1; i<=7; ++i)
            {
                if ( V[i]==0 )
                {
                    if ( (el+1)/2==(i+1)/2 )
                    {
                        // avem pereche
                        x=Cost[el];
                         //cout<<"@@@@@@@@ "<<x<<" "<<Cost[el]<<" ";
                        x+=abs( P[el].x-P[i].x );
                         //cout<<"!!"<<x<<" ";
                        x+=abs(P[el].y-P[i].y);
                         //cout<<"!!"<<x<<" ";
                        //cout<<"!!"<<x<<" ";
                        x=min(C[(i+1)/2]+Cost[el],x);
                        //cout<<"!!!"<<x<<"\n";
                        if ( Cost[i]>x)
                            Cost[i]=x;
                    }
                    else
                        if ( Cost[i]>Cost[el]+abs( P[el].x-P[i].x )+ abs(P[el].y-P[i].y)  )
                            Cost[i]=Cost[el]+abs( P[el].x-P[i].x )+ abs(P[el].y-P[i].y);
                }
            }
           /* for ( i=1; i<=7; ++i)
                cout<<Cost[i]<<" ";
            cout<<"\n"; */
            minim=n+m+5;
            for ( l=1; l<=7; ++l)
                if ( V[l]==0 && Cost[l]<minim)
                {
                    minim=Cost[l];
                    minim_el=l;
                }
            el=minim_el;
            V[el]=1;
        }
        out<<Cost[7]<<"\n";
    }
    return 0;
}