欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

679. 24 点游戏

程序员文章站 2022-03-08 15:12:09
679. 24 点游戏你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24。思路回溯直接从四个数里面取2个数,然后执行一次运算符运算,把结果加入数组里面,变成了3个数,再取2个数,再执行一次运算,变成2个数,直到剩下一个数,判断是否和24相同即可。除数不能为0加法和乘法有交换律,可以跳过重复的除法是实数除法,需要将数据转换为double类型,并且计算精度问题。代码class Solution {public: static c...

679. 24 点游戏

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

思路

回溯

直接从四个数里面取2个数,然后执行一次运算符运算,把结果加入数组里面,变成了3个数,再取2个数,再执行一次运算,变成2个数,直到剩下一个数,判断是否和24相同即可。

  • 除数不能为0
  • 加法和乘法有交换律,可以跳过重复的
  • 除法是实数除法,需要将数据转换为double类型,并且计算精度问题。

代码

class Solution {
public:
    static constexpr int target = 24;
    static constexpr double epsilon = 1e-6;
    static constexpr int add = 0, mul = 1, sub = 2, div = 3;
    bool judgePoint24(vector<int>& nums) {
        vector<double> list;
        for(int i = 0; i < nums.size(); i++) {
            list.push_back(static_cast<double>(nums[i]));
        }
        return solve(list);
    }
    bool solve(vector<double>& list) {
        if(list.size() == 0) {
            return false;
        }
        //列表只有一个数,判断是否等于24
        if(list.size() == 1) {
            return abs(list[0] - target) < epsilon;
        }
        //依次枚举2个数,不同序算不同
        for(int i = 0; i < list.size(); i++) {
            for(int j = 0; j < list.size(); j++) {
                if(i != j) {
                    vector<double> tmp;
                    //先将剩余的数入列表
                    for(int k = 0; k < list.size(); k++) {
                        if(k != i && k != j) {
                            tmp.push_back(list[k]);
                        }
                    }
                    //计算取出的两个数运算结果
                    for(int k = 0; k < 4; k++) {
                    	//加法和乘法符合交换律,可以跳过
                        if(k < 2 && i > j) {
                            continue;
                        }
                        //进行运算
                        if(k == add) {
                            tmp.push_back(list[i] + list[j]);
                        }
                        else if(k == mul) {
                            tmp.push_back(list[i] * list[j]);
                        }
                        else if(k == sub) {
                            tmp.push_back(list[i] - list[j]);
                        }
                        else {
                            if(list[j] < epsilon) {
                                continue;
                            }
                            tmp.push_back(list[i] / list[j]);
                        }
                        //继续递归判断
                        if(solve(tmp)) {
                            return true;
                        }
                        //回溯
                        tmp.pop_back();
                    }
                }
            }
        }
        return false;
    }
};

本文地址:https://blog.csdn.net/weixin_38688399/article/details/108169476

相关标签: Leecode