679. 24 点游戏

你有 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 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/24-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

import java.util.ArrayList;
import java.util.List;

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

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

    public boolean solve(List<Double> list) {
        if (list.size() == 1) {
            return Math.abs(list.get(0) - TARGET) < EPSILON;
        }

        if (list.size() == 0) {
            return false;
        }

        for (int i = 0; i < list.size(); ++i) {
            for (int j = 0; j < list.size(); ++j) {
                if (i == j) {
                    continue;
                }
                List<Double> tmp = new ArrayList<>();
                for (int k = 0; k < list.size(); ++k) {
                    if (k == i || k == j) {
                        continue;
                    }
                    tmp.add(list.get(k));
                }
                for (int k = 0; k < 4; ++k) {
                    if (k < 2 && j < i) {
                        continue;
                    }
                    List<Double> newList = new ArrayList<>(tmp);
                    if (k == ADD) {
                        newList.add(list.get(i) + list.get(j));
                    } else if (k == MULTIPLY) {
                        newList.add(list.get(i) * list.get(j));
                    } else if (k == SUBTRACT) {
                        newList.add(list.get(i) - list.get(j));
                    } else {
                        if (Math.abs(list.get(j)) > EPSILON) {
                            newList.add(list.get(i) / list.get(j));
                        }
                    }
                    if (solve(newList)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
}
posted @ 2021-12-28 14:03  Tianyiya  阅读(41)  评论(0)    收藏  举报