将给定的四个数字的所有可能的排列枚举出来,然后对于所有可能的两两数字进行四种运算,每次运算后,数组的大小会减一,当数组大小为2时,计算可能的四种结果并判断是否为24,如果结果为24则输出true,否则输出false。
#include <iostream>
#include <vector>
#include <set>
using namespace std;
void calculate(const vector<double> & nums, bool & flag);
void selectNum(const vector<double> & nums, bool & flag, set<int> orders, vector<double> nums_s) {
bool selected = true;
for (int i = 0; i < nums.size(); i++) {
if (orders.find(i) != orders.end()) {
nums_s.push_back(nums.at(i));
orders.erase(i);
if (nums_s.size() == 4) {
calculate(nums_s, flag);
return;
} else {
selectNum(nums, flag, orders, nums_s);
}
nums_s.erase(--nums_s.end());
orders.insert(i);
}
}
}
void calculate(const vector<double> & nums, bool & flag) {
if (nums.size() == 2) {
if (nums.at(0) + nums.at(1) == 24 || nums.at(0) - nums.at(1) == 24 || nums.at(0) * nums.at(1) == 24 || nums.at(0) / nums.at(1) == 24) {
flag = true;
}
return;
} else {
vector<double> temp;
vector<char> operation = {'+', '-', '*', '/'};
for (char element : operation) {
for (int i = 0; i < nums.size() - 1; i++) {
temp.clear();
for (int j = 0; j < i; j++) {
temp.push_back(nums.at(j));
}
if (element == '+') {
temp.push_back(nums.at(i) + nums.at(i + 1));
} else if (element == '-') {
temp.push_back(nums.at(i) - nums.at(i + 1));
} else if (element == '*') {
temp.push_back(nums.at(i) * nums.at(i + 1));
} else if (element == '/') {
temp.push_back(nums.at(i) / nums.at(i + 1));
}
for (int j = i + 2; j < nums.size(); j++) {
temp.push_back(nums.at(j));
}
calculate(temp, flag);
}
}
}
}
int main() {
vector<double> nums;
int number;
while (cin >> number) {
nums.push_back(number);
}
bool flag = false;
set<int> orders = {0, 1, 2, 3};
vector<double> nums_s;
selectNum(nums, flag, orders, nums_s);
if (flag) {
cout << "true";
} else {
cout << "false";
}
return 0;
}
// 64 位输出请用 printf("%lld")



京公网安备 11010502036488号