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