UVA 10344

来源:互联网 发布:构架师和程序员 编辑:程序博客网 时间:2024/06/07 12:29
/*刚开始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 ,好吧,以后吸取教训了}}}elsefor( 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" );elseprintf( "Impossible\n" );}return 0;}