题解 | #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;
}
查看6道真题和解析