题解 | #24点运算#
24点运算
https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d
import java.util.*; // 全排序+经典回溯 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextLine()) { System.out.println(f(in.nextLine())); } } public static String f(String poker) { String[] split = poker.split(" "); res = null; preSort(split, 0); return res == null ? "NONE" : res; } public static void preSort(String[] express, int idx) { if (res != null) return; if (idx >= 4) { if (map.containsKey(express[0])) { List<String> temp = new ArrayList<String>(); temp.add(express[0]); count2(express, 1, temp, map.get(express[0])); } else { res = "ERROR"; return; } } for (int i = idx; i < express.length; i++) { swap(express, i, idx); preSort(express, idx + 1); swap(express, i, idx); } } public static void swap(String[] e, int l, int r) { String temp = e[l]; e[l] = e[r]; e[r] = temp; } public static void count2(String[] poker, int idx, List<String> b, int v) { if (res != null) return; if (idx >= 4) { if (v == 24) { res = convert(b); } return; } for (int i = 0; i < 4; i++) { if (map.containsKey(poker[idx])) { b.add(al[i] + ""); b.add(poker[idx]); count2(poker, idx + 1, b, compute(v, map.get(poker[idx]), i)); b.remove((b.size() - 1)); b.remove(b.size() - 1); } else { res = "ERROR"; return; } } } public static String convert(List<String> list) { StringBuilder b = new StringBuilder(); for (String s : list) { b.append(s); } return b.toString(); } //分治 求有多少种结果,不是用来求此题的方案,但同为枚举表达式的方案技巧 public static List<Integer> count(String[] e, int l, int r) { List<Integer> list = new ArrayList<Integer>(); if (l == r) { list.add(map.get(e[l])); return list; } for (int i = l; i <= r; i++) { List<Integer> right = count(e, i + 1, r); List<Integer> left = count(e, l, i); for (Integer re : right) { for (Integer le : left) { for (int j = 0; j < 4; j++) { if (j == 3 && re == 0) { continue; } else { list.add(compute(le, re, j)); } } } } } return list; } public static int compute(int a, int b, int idx) { char e = al[idx]; if (e == '+') { return a + b; } else if (e == '-') { return a - b; } else if (e == '*') { return a * b; } else { return a / b; } } static Map<String, Integer> map = new HashMap<>(); static char[] al = {'+', '-', '*', '/'}; static String res; static { map.put("A", 1); map.put("2", 2); map.put("3", 3); map.put("4", 4); map.put("5", 5); map.put("6", 6); map.put("7", 7); map.put("8", 8); map.put("9", 9); map.put("10", 10); map.put("J", 11); map.put("Q", 12); map.put("K", 13); } }