/*刚开始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; }