题解 | #24点游戏算法# (考虑括号)
24点游戏算法
https://www.nowcoder.com/practice/fbc417f314f745b1978fc751a54ac8cb?tpId=37&tqId=21290&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
高赞题解的改进,主要多考虑了包含括号的情况
#include<iostream> #include<vector> using namespace std; bool check(vector<double> nums, double result){ //递归检查能否组成24 if(nums.empty()) //数组为空,判断等不等于24 return abs(result-24)<0.001; if(result!=NULL) nums.push_back(result); for(int i = 0; i < nums.size()-1; i++) for(int j=i+1;j<nums.size();j++){ //遍历剩下的数字 vector<double> rest(nums); rest.erase(rest.begin() + i); rest.erase(rest.begin() + j - 1); //删去使用的数字,且rest第一次删去下表i的数,第二次应该删去j-1 (j>i) if(check(rest, nums[i] + nums[j]) //分别 进行加减乘除4种运算 || check(rest, nums[i] - nums[j]) || check(rest, nums[j] - nums[i]) || check(rest, nums[i] * nums[j]) || (nums[j]==0?false:check(rest, nums[i] / nums[j])) || (nums[i]==0?false:check(rest, nums[j] / nums[i]))) return true; } return false; } int main(){ vector<double> nums(4); while(cin >> nums[0] >> nums[1] >> nums[2] >> nums[3]){ //输入4个数字 if(check(nums, NULL)) cout << "true" << endl; else cout << "false" << endl; } return 0; }