Pagini recente » Cod sursa (job #2584215) | Cod sursa (job #1129553) | Cod sursa (job #3062710) | Cod sursa (job #1571604) | Cod sursa (job #635400)
Cod sursa(job #635400)
#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 = 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 );
}
}