现在的位置: 首页 > 综合 > 正文

UVA 10344

2013年08月17日 ⁄ 综合 ⁄ 共 895字 ⁄ 字号 评论关闭
/*刚开始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;
}

抱歉!评论已关闭.