Cod sursa(job #635409)

Utilizator irene_mFMI Irina Iancu irene_m Data 19 noiembrie 2011 11:15:19
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 1.97 kb
#include <cstdio>

const int MAX_N = 10;
const long long INF = 5000000000;

struct point{
    long long x, y;
}   P[ MAX_N ];

long long dist[ MAX_N ][ MAX_N ], C[ MAX_N ], use[ MAX_N ], gen[ MAX_N ], N, M, min;
int T;

long long abs( long long X){
    if( X >= 0 )
        return X;
    return - X;
}

long long minim( long long A, long long B ){
    if( A < B )
        return A;
    return B;
}

void initial_dist(){

    int i, j;
    for( i = 1; i < 6; ++i )
        for( j = i + 1; j <= 6; ++j )
            dist[ i ][ j ] = dist[ j ][ i ] = abs( P[ i ].x - P[ j ].x ) + abs( P[ i ].y - P[ j ].y );

    dist[ 1 ][ 2 ] = dist[ 2 ][ 1 ] = minim( dist[ 1 ][ 2 ], C[ 1 ] );
    dist[ 3 ][ 4 ] = dist[ 4 ][ 3 ] = minim( dist[ 3 ][ 4 ], C[ 2 ] );
    dist[ 5 ][ 6 ] = dist[ 6 ][ 5 ] = minim( dist[ 5 ][ 6 ], C[ 3 ] );

    for( i = 1; i <= 6; ++i ){
        dist[ 0 ][ i ] = P[ i ].x + P[ i ].y;
        dist[ i ][ 7 ] = N - P[ i ].x + M - P[ i ].y;
    }

}

void generate( int k, long long sum ){

    int i;

    if( k > 6 )
    {
        if( sum < min )
            min = sum;
    }
    else
        for( i = gen[ k - 1 ] + 1; i <= 6; ++i )
            if( ! use[ i ] ){
                use[ i ] = 1;
                gen[ k ] = i;
                generate( k + 1, sum + dist[ gen[ k - 1 ] ][ i ] );
                use[ i ] = 0;
            }
}

int main(){
    freopen( "portal3.in", "r", stdin );
    freopen( "portal3.out", "w", stdout );

    scanf( "%d", &T );
    for( ; T; T-- ){
        scanf( "%lld %lld", &N, &M );
        scanf( "%lld %lld %lld %lld %lld", &P[ 1 ].x, &P[ 1 ].y, &P[ 2 ].x, &P[ 2 ].y, &C[ 1 ] );
        scanf( "%lld %lld %lld %lld %lld", &P[ 3 ].x, &P[ 3 ].y, &P[ 4 ].x, &P[ 4 ].y, &C[ 2 ] );
        scanf( "%lld %lld %lld %lld %lld", &P[ 5 ].x, &P[ 5 ].y, &P[ 6 ].x, &P[ 6 ].y, &C[ 3 ] );
        initial_dist();
        min = INF;
        generate( 1, 0 );
        printf( "%lld\n", min - 6 );
    }
}