最新文章
这里会显示最新的几篇文章摘要。
记录生活,分享知识,与你一起成长。
这里会显示最新的几篇文章摘要。
#include <bits/stdc++.h>
using namespace std;
/**
* 尝试从 arr 中选出任意两个数 a、b,用四则运算合并它们,递归检验能否得到 24。
* @param arr 当前可用数字(浮点数)
* @return 若能组成 24,返回 true,否则返回 false
*/
bool canMake24(vector<double> &arr) {
// 递归基:如果只剩一个数,判断它是否与 24 足够接近
if (arr.size() == 1) {
return fabs(arr[0] - 24.0) < 1e-6;
}
// 遍历数组,选出两数 a、b,进行加减乘除,再继续递归
for (int i = 0; i < (int)arr.size(); i++) {
for (int j = i + 1; j < (int)arr.size(); j++) {
double a = arr[i], b = arr[j];
// 先将这两个数从数组移除
vector<double> next;
for (int k = 0; k < (int)arr.size(); k++) {
if (k != i && k != j) {
next.push_back(arr[k]);
}
}
// 尝试各种合法运算
vector<double> results = {a + b, a - b, b - a, a * b};
if (fabs(b) > 1e-6) {
results.push_back(a / b);
}
if (fabs(a) > 1e-6) {
results.push_back(b / a);
}
// 将每个运算结果合并到数组,再递归判断
for (double r : results) {
next.push_back(r);
if (canMake24(next)) {
return true;
}
next.pop_back(); // 回溯
}
}
}
return false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t; // 测试次数
while (t--) {
vector<double> nums(4);
for (int i = 0; i < 4; ++i) {
cin >> nums[i];
}
// 判断这 4 个数能否通过四则运算组成 24
cout << (canMake24(nums) ? "YES" : "NO") << "\n";
}
return 0;
}