【LeetCode】679. 24 点游戏

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

参考资料:

  1. 【详解】递归回溯,考察基本功 | 679. 24点游戏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值