1-5 用扑克牌计算24点

题目

一副扑克牌的每张牌表示一个数(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

解析:

没想到什么好的方法,就直接暴力解了,先分析一波可能出现的情况,4位整数的位置不做改变,对运算符号和加的括号的情况进行枚举,枚举出每种可能的情况,如果结果等于24,则输出。

#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 fun(char* a, float* num)	//枚举64种符号的排列,并结合5种括号的形式
{
	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 (fun(b[i], num))
			return 0;
	printf("-1");
	return 0;
}
上一篇:sql 将查询结果插入已存在表


下一篇:T2. 质数的和(11.19)