中等难度也有一道24点的题 差不多一样的思路 甚至比那个还简单 \doge
先对某一种牌序进行+-*/的深搜 如果有结果就更新结果(默认结果是"NONE")并返回 没结果就换一种牌序列继续深搜 直到搜完了所有牌序
import java.util.*;

public class Main {
    static Map<String, Integer> CARD_TO_VALUE_MAP = new HashMap<String, Integer>() {{
        put("A", 1);
        put("2", 2);
        put("3", 3);
        put("4", 4);
        put("5", 5);
        put("6", 6);
        put("7", 7);
        put("8", 8);
        put("9", 9);
        put("10", 10);
        put("J", 11);
        put("Q", 12);
        put("K", 13);
    }};
    static Map<Integer, String> VALUE_TO_CARD_MAP = new HashMap<Integer, String>() {{
        put(1, "A");
        put(2, "2");
        put(3, "3");
        put(4, "4");
        put(5, "5");
        put(6, "6");
        put(7, "7");
        put(8, "8");
        put(9, "9");
        put(10, "10");
        put(11, "J");
        put(12, "Q");
        put(13, "K");
    }};
    static LinkedList<Integer> stack = new LinkedList<Integer>();
    static final int[] indexes = new int[]{0, 1, 2, 3};
    static int[] cards;
    static String result = "NONE";

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        if (s.contains("joker") || s.contains("JOKER")) {
            System.out.println("ERROR");
        } else {
            String[] sc = s.split(" ");
            cards = card2int(sc);
            permute(0);
            System.out.println(result);
        }
    }

    static int[] card2int(String[] sc) {
        int[] ic = new int[sc.length];
        for (int i = 0; i < ic.length; i++) {
            ic[i] = CARD_TO_VALUE_MAP.get(sc[i]);
        }
        return ic;
    }

    static String combine(String s, String op, int[] a, int cur) {
        if (cur == 0) {
            return s + VALUE_TO_CARD_MAP.get(a[cur]) + op + VALUE_TO_CARD_MAP.get(a[cur + 1]);
        } else {
            return s + op + VALUE_TO_CARD_MAP.get(a[cur + 1]);
        }
    }

    static boolean dfs(int[] a, int cur, String s) {
        if (a.length - 1 == cur) {
            if (a[0] == 24) {
                result = s;
                return true;
            } else {
                return false;
            }
        } else {
            int[] a1 = Arrays.copyOf(a, a.length);
            int[] a2 = Arrays.copyOf(a, a.length);
            int[] a3 = Arrays.copyOf(a, a.length);
            int[] a4 = Arrays.copyOf(a, a.length);
            a1[0] = a[0] + a[cur + 1];
            a2[0] = a[0] - a[cur + 1];
            a3[0] = a[0] * a[cur + 1];
            a4[0] = a[0] / a[cur + 1];
            return dfs(a1, cur + 1, combine(s, "+", a, cur))
                    || dfs(a2, cur + 1, combine(s, "-", a, cur))
                    || dfs(a3, cur + 1, combine(s, "*", a, cur))
                    || dfs(a4, cur + 1, combine(s, "/", a, cur));
        }
    }

    static void permute(int cur) {
        if (cur == indexes.length) {
            int[] c = getCardsByStack();
            if (dfs(c, 0,"")) {
                return;
            }
        }
        for (int index : indexes) {
            if (!stack.contains(index)) {
                stack.push(index);
                permute(cur + 1);
                stack.pop();
            }
        }
    }

    static int[] getCardsByStack() {
        int[] temp = new int[cards.length];
        for (int i = 0; i < temp.length; i++) {
            temp[i] = cards[stack.get(i)];
        }
        return temp;
    }
}