LeetCode——24 点游戏

Posted Shaw_喆宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode——24 点游戏相关的知识,希望对你有一定的参考价值。

Q:你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过?*,/,+,-,(,)?的运算得到 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 。

A:
回溯法
代码:

    public boolean judgePoint24(int[] nums) {
        ArrayList<Double> array = new ArrayList<>();
        for (int n : nums) {
            array.add((double) n);
        }
        return solve(array);
    }

    //从数组中选出两个数,把运算结果加到数组中
    private boolean solve(ArrayList<Double> array) {
        if (array.size() == 1) {//数组中只剩下一个数的时候判断结果
            return Math.abs(array.get(0) - 24) < 1e-6;
        }
        //从numbers中取出两个数,把结果放入数组中
        for (int i = 0; i < array.size(); i++) {
            for (int j = 0; j < array.size(); j++) {
                if (i != j) {
                    //取不同的两个数
                    ArrayList<Double> nums = new ArrayList<>();
                    for (int k = 0; k < array.size(); k++) {
                        if (k != i && k != j) {
                            //把剩下的数加入到新数组
                            nums.add(array.get(k));
                        }
                    }
                    //获取两个数运算的结果集
                    Set<Double> doubles = calculate(array.get(i), array.get(j));
                    for (Double a : doubles) {
                        //把两个数运算的结果,分别加入到新数组中
                        nums.add(a);
                        if (solve(nums)) {//找到一个结果,立即返回
                            return true;
                        }
                        nums.remove(nums.size() - 1);//恢复现场
                    }
                }
            }
        }
        return false;
    }

    private Set<Double> calculate(Double a, Double b) {
        Set<Double> res = new HashSet<>();
        res.add(a - b);
        res.add(b - a);
        res.add(a + b);
        res.add(a * b);
        if (a != 0) {
            res.add(b / a);
        }
        if (b != 0) {
            res.add(a / b);
        }
        return res;
    }












以上是关于LeetCode——24 点游戏的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode之深度优先搜索&回溯专题-679. 24 点游戏(24 Game)

[LeetCode] 24 Game 二十四点游戏

python实现24点游戏(地球上最短的24点游戏代码?)

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段

24点游戏

如何用C语言做一个24点游戏的程序?