【LeetCode】679. 24 点游戏

679. 24 点游戏(困难)

【LeetCode】679. 24 点游戏_第1张图片
【LeetCode】679. 24 点游戏_第2张图片

思路

【LeetCode】679. 24 点游戏_第3张图片

【LeetCode】679. 24 点游戏_第4张图片
【LeetCode】679. 24 点游戏_第5张图片

  • 注意

【LeetCode】679. 24 点游戏_第6张图片

代码

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;
    }
};

参考资料:

  1. 【详解】递归回溯,考察基本功 | 679. 24点游戏

你可能感兴趣的:(LeetCode刷题,leetcode,游戏,算法)