题解 | #24点运算#
24点运算
https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d
import java.util.*;
public class Main {
static String[] arrStr;
static int[] arr;
static boolean[] booleans;
static ArrayList<String> list;
static ArrayList<String> tempList;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String input = in.nextLine();
arrStr = input.split(" ");
arr = new int[4];
booleans = new boolean[4];
list = new ArrayList<>();
tempList = new ArrayList<>();
for (int i = 0; i < arrStr.length; i++) {
if (arrStr[i].equals("joker") || arrStr[i].equals("JOKER")) {
System.out.println("ERROR");
System.exit(0);
} else {
arr[i] = getNum(arrStr[i]);
}
}
dfs(0, 0);
if (list.size() == 0) {
System.out.println("NONE");
} else {
System.out.println(list.get(0));
}
}
private static void dfs(int index, int sum) {
//边界条件
if (index == 3) {
if (sum == 24) {
String temp = "";
for (int i = 0; i < tempList.size(); i++) {
temp += tempList.get(i);
}
list.add(temp);
}
return;
}
//搜索
if (index == 0) {
for (int i = 0; i < 4; i++) {
for (int j = i + 1; j < 4; j++) {
for (int k = 0; k < 6; k++) {
switch (k) {
case 0:
booleans[i] = true;
booleans[j] = true;
tempList.add(arrStr[i] + "+" + arrStr[j]);
dfs(index + 1, arr[i] + arr[j]);
tempList.remove(tempList.size() - 1);
booleans[i] = false;
booleans[j] = false;
break;
case 1:
booleans[i] = true;
booleans[j] = true;
tempList.add(arrStr[i] + "-" + arrStr[j]);
dfs(index + 1, arr[i] - arr[j]);
tempList.remove(tempList.size() - 1);
booleans[i] = false;
booleans[j] = false;
break;
case 2:
booleans[i] = true;
booleans[j] = true;
tempList.add(arrStr[i] + "*" + arrStr[j]);
dfs(index + 1, arr[i] * arr[j]);
tempList.remove(tempList.size() - 1);
booleans[i] = false;
booleans[j] = false;
break;
case 3:
booleans[i] = true;
booleans[j] = true;
tempList.add(arrStr[i] + "/" + arrStr[j]);
dfs(index + 1, arr[i] / arr[j]);
tempList.remove(tempList.size() - 1);
booleans[i] = false;
booleans[j] = false;
break;
case 4:
booleans[i] = true;
booleans[j] = true;
tempList.add(arrStr[j] + "/" + arrStr[i]);
dfs(index + 1, arr[j] / arr[i]);
tempList.remove(tempList.size() - 1);
booleans[i] = false;
booleans[j] = false;
break;
case 5:
booleans[i] = true;
booleans[j] = true;
tempList.add(arrStr[j] + "-" + arrStr[i]);
dfs(index + 1, arr[j] - arr[i]);
tempList.remove(tempList.size() - 1);
booleans[i] = false;
booleans[j] = false;
break;
}
}
}
}
} else {
for (int i = 0; i < 4; i++) {
if (!booleans[i]) {
for (int k = 0; k < 4; k++) {
switch (k) {
case 0:
booleans[i] = true;
tempList.add("+" + arrStr[i]);
dfs(index + 1, sum + arr[i]);
tempList.remove(tempList.size() - 1);
booleans[i] = false;
break;
case 1:
booleans[i] = true;
tempList.add("-" + arrStr[i]);
dfs(index + 1, sum - arr[i]);
tempList.remove(tempList.size() - 1);
booleans[i] = false;
break;
case 2:
booleans[i] = true;
tempList.add("*" + arrStr[i]);
dfs(index + 1, sum * arr[i]);
tempList.remove(tempList.size() - 1);
booleans[i] = false;
break;
case 3:
booleans[i] = true;
tempList.add("/" + arrStr[i]);
dfs(index + 1, sum / arr[i]);
tempList.remove(tempList.size() - 1);
booleans[i] = false;
break;
}
}
}
}
}
}
private static int getNum(String s) {
switch (s) {
case "2":
return 2;
case "3":
return 3;
case "4":
return 4;
case "5":
return 5;
case "6":
return 6;
case "7":
return 7;
case "8":
return 8;
case "9":
return 9;
case "10":
return 10;
case "J":
return 11;
case "Q":
return 12;
case "K":
return 13;
case "A":
return 1;
default:
return -1;
}
}
}
解题思路:
1, 采用深度搜索的方法, 对各个计算方案进行遍历;
2, 分析最终的结果集, 并进行输出