题解 | #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);
}
}
