PTA 用扑克牌计算24点

393 阅读2分钟

一副扑克牌的每张牌表示一个数(J、Q、K 分别表示 11、12、13,两个司令都表示 6)。任取4 张牌,即得到 4 个 1~13 的数,请添加运算符(规定为加+ 减- 乘* 除/ 四种)使之成为一个运算式。每个数只能参与一次运算,4 个数顺序可以任意组合,4 个运算符任意取 3 个且可以重复取。运算遵从一定优先级别,可加括号控制,最终使运算结果为 24。请输出一种解决方案的表达式,用括号表示运算优先。如果没有一种解决方案,则输出 -1 表示无解。

输入格式:

输入在一行中给出 4 个整数,每个整数取值在 [1, 13]。

输出格式:

输出任一种解决方案的表达式,用括号表示运算优先。如果没有解决方案,请输出 -1。

输入样例:

2 3 12 12
结尾无空行

输出样例:

((3-2)*12)+12
结尾无空行

代码:

#include<stdio.h>
float operation(float a,float b,char c)
{
	float sum=0;
	switch(c)
	{
		case '+':
			sum=a+b;
		break;
		case '-':
			sum=a-b;
		break;
		case '*':
			sum=a*b;
		break;
		case '/':
			sum=a/b;
		break;
	}
	return sum;
}
int number(char* a,float*num)
{
	float t1=0;
	float t2=0;
	float sum=0;
	int i,j,k,l;
	for(i=0;i<4;++i)
	  for(j=0;j<4;++j)
		  for(k=0;k<4;++k)
				for(l=0;l<4;++l)
					if( i!=j && i!=k && i!=l && j!=k && j!=l && k!=l )
					{
						t1=operation(num[i],num[j],*a);
						t2=operation(t1,num[k],*(a+1));
						sum=operation(t2,num[l],*(a+2));
						if(sum==24)
						{
							printf("((%.0f%c%.0f)%c%.0f)%c%.0f",num[i],*a,num[j],*(a+1),num[k],*(a+2),num[l]);
							return 1;
						}
						t1=operation(num[j],num[k],*(a+1));
						t2=operation(num[i],t1,*a);
						sum=operation(t2,num[l],*(a+2));
						if(sum==24)
						{
							printf("(%.0f%c(%.0f%c%.0f))%c%.0f",num[i],*a,num[j],*(a+1),num[k],*(a+2),num[l]);
							return 1;
						}
						t1=operation(num[i],num[j],*a);
						t2=operation(num[k],num[l],*(a+2));
						sum=operation(t1,t2,*(a+1));
						if(sum==24)
						{
							printf("(%.0f%c%.0f)%c(%.0f%c%.0f)",num[i],*a,num[j],*(a+1),num[k],*(a+2),num[l]);
							return 1;
						}
						t1=operation(num[k],num[l],*(a+2));
						t2=operation(num[j],t1,*(a+1));
						sum=operation(num[i],t2,*a);
						if(sum==24)
						{
							printf("%.0f%c(%.0f%c(%.0f%c%.0f))",num[i],*a,num[j],*(a+1),num[k],*(a+2),num[l]);
							return 1;
						}
						t1=operation(num[j],num[k],*(a+1));
						t2=operation(t1,num[l],*(a+2));
						sum=operation(num[i],t2,*a);
						if(sum==24)
						{
							printf("%.0f%c((%.0f%c%.0f)%c%.0f)",num[i],*a,num[j],*(a+1),num[k],*(a+2),num[l]);
							return 1;
						}
					}
	return 0;
}
int main(void)
{
	char a[6]="+-*/";
	char b[64][5]={0};
	float num[4]={0};
	int i=0,j=0,k=0,l=0,m=0;
	int count=0;
	for(i=0;i<4;++i)
	scanf("%f",&num[i]);
	for(i=0;i<4;++i)
		for(j=0;j<4;++j)
			for(k=0;k<4;++k)
			{	
				b[l][m]=a[i];
				b[l][m+1]=a[j];
				b[l][m+2]=a[k];
				++l;
			}
	for(i=0;i<64;++i)
		if(number(b[i],num))
			return 0;
	printf("-1");
	return 0;
}

提交结果: