679. 24 点游戏(困难)
思路
- 注意:
代码
class Solution {
public:
bool judgePoint24(vector<int>& cards) {
vector<double> digits;
for(int c : cards){
digits.push_back((double)c);
}
return backtracking(digits);
}
bool backtracking(vector<double> &digits){
int n = digits.size();
if(n == 1){
// 说明已经合并到只剩下一个元素
return (abs(digits[0] - 24) < 0.001);
}
for(int i=0; i<n-1; ++i){
for(int j=i+1; j<n; ++j){
// 挑选两个数字进行运算
vector<double> newDigits;
for(int k=0; k<n; ++k){
// 第三个数字不能和前两个数字相等
// 如果选到了之前的数字需要重新挑选
if(k == i || k == j) continue;
newDigits.push_back(digits[k]);
}
// 标识变量isValid初始为 false,默认会执行||后面的递归。
// 一旦某个递归返回真,isValid就变为真
// 由于||的短路特性,后面的递归不会执行
bool valid = false;
// 加法
newDigits.push_back(digits[i] + digits[j]);
valid = valid || backtracking(newDigits);
// 回退
newDigits.pop_back();
// 减法:注意两个数相减有两种结果
newDigits.push_back(digits[i] - digits[j]);
valid = valid || backtracking(newDigits);
newDigits.pop_back();
newDigits.push_back(digits[j] - digits[i]);
valid = valid || backtracking(newDigits);
newDigits.pop_back();
// 乘法
newDigits.push_back(digits[i] * digits[j]);
valid = valid || backtracking(newDigits);
newDigits.pop_back();
// 除法 一样有两种可能结果
// 分母不能为0
if(digits[i] != 0){
newDigits.push_back(digits[j] / digits[i]);
valid = valid || backtracking(newDigits);
newDigits.pop_back();
}
if(digits[j] != 0){
newDigits.push_back(digits[i] / digits[j]);
valid = valid || backtracking(newDigits);
newDigits.pop_back();
}
if(valid) return true;
}
}
return false;
}
};