题解 | #24点游戏算法#
24点游戏算法
https://www.nowcoder.com/practice/fbc417f314f745b1978fc751a54ac8cb
将给定的四个数字的所有可能的排列枚举出来,然后对于所有可能的两两数字进行四种运算,每次运算后,数组的大小会减一,当数组大小为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")
中等(算法题解) 文章被收录于专栏
中等难度题目