LeetCode 679. 24 点游戏 dfs

地址 https://leetcode-cn.com/problems/24-game/

复制代码
你有 4 张写有 19 数字的牌。你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24。

示例 1:

输入: [4, 1, 8, 7]
输出: True
解释: (8-4) * (7-1) = 24
示例 2:

输入: [1, 2, 1, 2]
输出: False
注意:

除法运算符 / 表示实数除法,而不是整数除法。例如 4 / (1 - 2/3) = 12 。
每个运算符对两个数进行运算。特别是我们不能用 - 作为一元运算符。例如,[1, 1, 1, 1] 作为输入时,表达式 -1 - 1 - 1 - 1 是不允许的。
你不能将数字连接在一起。例如,输入为 [1, 2, 1, 2] 时,不能写成 12 + 12
复制代码

算法1
首先考虑的是DFS,抽取任意两个数字进行任意计算,
然后将结果放入到抽取池中,进行下一次抽取.
这样可以遍历到所有的可能计算方式,不必考虑括号。
另一点需要注意的就是分数方案,需要使用double。

C++ 代码

复制代码
class Solution {
public:
   vector<char> ops = { '+','-','*','/' };


bool judge(const vector<double>& nums, double target)
{
    if (nums.size() == 1) {
        return abs(nums[0] - (double)target)< 1e-5;
    }


    for (int i = 0; i < nums.size(); i++) {
        for (int j = i + 1; j < nums.size(); j++) {
            vector<double> copy = nums;
            double a = nums[i]; double b = nums[j];
            copy.erase(copy.begin() + i);
            copy.erase(copy.begin() + j-1);

            copy.push_back(a + b);
            if (judge(copy, 24)) 
                return true;
            copy.pop_back();

            copy.push_back(a * b);
            if (judge(copy, 24)) 
                return true;
            copy.pop_back();

            copy.push_back(a - b);
            if (judge(copy, 24)) 
                return true;
            copy.pop_back();

            copy.push_back(b - a);
            if (judge(copy, 24)) 
                return true;
            copy.pop_back();

            if (a != 0) {
                copy.push_back(b / a);
                if (judge(copy, 24)) 
                    return true;
                copy.pop_back();
            }

            if (b != 0) {
                copy.push_back(a / b);
                if (judge(copy, 24)) 
                    return true;
                copy.pop_back();
            }
        }
    }

    return false;
}


bool judgePoint24(vector<int>& nums) {
    vector<double> v(nums.begin(),nums.end());
    return judge(v, 24);
}
};
复制代码

 

posted on   itdef  阅读(233)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示