/*刚开始TLE 后来发现递归函数找到23点的时候推到上一层就不超时了,好吧。。。*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int sign[100][10];
int flag;
void print( int *A, int *P, int cur )
{
int i, j, c1, c2, sum;
if( cur == 5 )
{
for( i = 0; i < 81; i++ )
{
sum = A[0];
for( j = 0; j < 4; j++ )
{
switch( sign[i][j] )
{
case 0: sum += A[j+1]; break;
case 1: sum -= A[j+1]; break;
case 2: sum *= A[j+1]; break;
}
}
if( sum == 23 )
{
flag = 1;
return ; //第一次没加return; TLE ,好吧,以后吸取教训了
}
}
}
else
for( i = 0; i < 5; i++ )
{
if( !i || P[i] != P[i-1] )
{
c1 = c2 = 0;
for( j = 0; j < cur; j++ ) if( A[j] == P[i] ) c1++;
for( j = 0; j < 5; j++ ) if( P[j] == P[i] ) c2++;
if( c1 < c2 )
{
A[cur] = P[i];
print( A, P, cur+1 );
}
}
}
}
int main()
{
int P[10], A[10];
int num, a, b, c, d;
num = 0;
for( a = 0; a < 3; a++ )
for( b = 0; b < 3; b++ )
for( c = 0; c < 3; c++ )
for( d = 0; d < 3; d++ )
{
sign[num][0] = a;
sign[num][1] = b;
sign[num][2] = c;
sign[num][3] = d;
num++;
}
while( scanf( "%d%d%d%d%d", &P[0], &P[1], &P[2], &P[3], &P[4] ) != EOF && ( P[0] || P[1] || P[2] || P[3] || P[4] ) )
{
flag = 0;
print( A, P, 0 );
if( flag )
printf( "Possible\n" );
else
printf( "Impossible\n" );
}
return 0;
}
UVA 10344
最新推荐文章于 2017-11-14 00:04:00 发布