ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode 679 24点游戏

2022-02-03 21:05:28  阅读:186  来源: 互联网

标签:24 emplace 679 int list back list2 times LeetCode


题目链接:LeetCode 679 24点游戏

题目大意:
给定四个数,判断是否可以通过加减乘除和括号计算出\(24\)点。

题解:
一共有\(4\)个数和\(3\)个运算操作,因此可能性非常有限。
首先从\(4\)个数字中有序地选出\(2\)个数字,共有\(4 \times 3 = 12\)种选法,并选择加、减、乘、除\(4\)种运算操作之一,用得到的结果取代选出的\(2\)个数字,剩下\(3\)个数字。
然后在剩下的\(3\)个数字中有序地选出\(2\)个数字,共有\(3 \times 2 = 6\)种选法,并选择\(4\)种运算操作之一,用得到的结果取代选出的\(2\)个数字,剩下\(2\)个数字。
最后剩下\(2\)个数字,有\(2\)种不同的顺序,并选择\(4\)种运算操作之一。
因此,一共有\(12 \times 4 \times 6 \times 4 \times 2 \times 4 = 9216\)种不同的可能性。
通过搜索和回溯遍历所有的可能情况。

class Solution {
public:
    static constexpr int TARGET = 24;
    static constexpr double EPSILON = 1e-6;
    static constexpr int ADD = 0, MULTIPLY = 1, SUBTRACT = 2, DIVIDE = 3;

    bool judgePoint24(vector<int>& cards) {
        vector<double> list;
        for (const int& num : cards) {
            list.emplace_back(static_cast<double>(num));
        }
        return solve(list);
    }

    bool solve(vector<double>& list) {
        if (list.size() == 1) {
            return fabs(list[0] - TARGET) < EPSILON;
        }
        int size = list.size();
        for (int i = 0; i < size; ++i) {
            for (int j = 0; j < size; ++j) {
                if (i != j) {
                    vector<double> list2;
                    for (int k = 0; k < size; ++k) {
                        if (k != i && k != j) {
                            list2.emplace_back(list[k]);
                        }
                    }
                    for (int k = 0; k < 4; ++k) {
                        if (k < 2 && i > j) { // 加法和乘法交换律
                            continue;
                        }
                        if (k == ADD) { // 加
                            list2.emplace_back(list[i] + list[j]);
                        } else if (k == MULTIPLY) { // 减
                            list2.emplace_back(list[i] * list[j]);
                        } else if (k == SUBTRACT) { // 乘
                            list2.emplace_back(list[i] - list[j]);
                        } else if (k == DIVIDE) { // 除
                            if (fabs(list[j]) < EPSILON) { 
                                continue;
                            }
                            list2.emplace_back(list[i] / list[j]);
                        }
                        if (solve(list2)) {
                            return true;
                        }
                        list2.pop_back();
                    }
                }
            }
        }
        return false;
    }
};

标签:24,emplace,679,int,list,back,list2,times,LeetCode
来源: https://www.cnblogs.com/IzumiSagiri/p/15861975.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有