问题描述
24点游戏是一个非常有意思的游戏,很流行,玩法很简单:给你4张牌,每张牌上有数字(其中A代表1,J代表11,Q代表12,K代表13),你可以利用数学中的加、减、乘、除以及括号想办法得到24,例如:
((A*K)-J)*Q等价于((1*13)-11)*12=24
加减乘不用多说了,但除法必须满足能整除才能除!这样有一些是得不到24点的,所以这里只要求求出不超过24的最大值。
输入格式
输入第一行N(1<=N<=5)表示有N组测试数据。每组测试数据输入4行,每行一个整数(1到13)表示牌值。
输出格式
每组测试数据输出一个整数,表示所能得到的最大的不超过24的值。
样例输入
3
3
3
3
3
1
1
1
1
12
5
13
1
样例输出
24
4
21
#include <iostream>
using namespace std;
int num[5] = { 0 };
int maxValue = 0;
void calculate(int time) {
if (time == 3) {
if (num[0] <= 24) {
maxValue = max(maxValue, num[0]);
}
return;
}
for (int i = 0; i < 3 - time; i++) {
for (int j = i + 1; j < 4 - time; j++) {
int num1 = num[i];
int num2 = num[j];
num[j] = num1 + num2;
num[i] = num[3 - time];
calculate(time + 1);
num[j] = num1 * num2;
num[i] = num[3 - time];
calculate(time + 1);
num[j] = num1 - num2;
num[i] = num[3 - time];
calculate(time + 1);
num[j] = num2 - num1;
num[i] = num[3 - time];
calculate(time + 1);
if (num2 != 0 && num1 % num2 == 0) {
num[j] = num1 / num2;
num[i] = num[3 - time];
calculate(time + 1);
}
if (num1 != 0 && num2 % num1 == 0) {
num[j] = num2 / num1;
num[i] = num[3 - time];
calculate(time + 1);
}
num[i] = num1;
num[j] = num2;
}
}
}
int main() {
int N;
cin >> N;
while (N > 0) {
N--;
for (int i = 0; i < 4; i++) {
cin >> num[i];
}
calculate(0);
cout << maxValue << endl;
maxValue = 0;
}
return 0;
}
总结:
类似跳马这种https://blog.csdn.net/m0_65406049/article/details/128850838?spm=1001.2014.3001.5501
但是我一开始只是用单个数去做递归
然后按照顺序,一个数直接加减乘除下一个数,但是这样没有考虑全,得考虑括号这种运算
有可能中间随机两个数加减,会有更大的结果
所以得让两个数随机运算,这样才能考虑所有结果,并找到最接近24的答案