题解 | #24点运算#
24点运算
https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d
import java.util.*;
import java.io.*;
public class Main {
static Map<String,Integer> map = new HashMap<String,Integer>(){
{
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);
put("A",1);
}
};
// static Stack<Integer> stack = new Stack<>();
// static ArrayList<String> list = new ArrayList<>();
static String str_="";
static String[] nums = new String[4];
static boolean[] visit = new boolean[4];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String x=in.nextLine();
if(x.contains("joker")||x.contains("JOKER")) {
System.out.println("ERROR");
break;
}
String[] a = x.split(" ");
for (int i = 0; i < 4; i ++)nums[i] = a[i];
System.out.println(dfs(0, 0,"")?str_:"NONE");
}
}
// tmp是前面n个数字运算结果,u表示已经使用了多少个数字
static boolean dfs(int u, float tmp,String note) {
// 递归终止条件:已经使用了数组四个元素,同时结果为24,满足题意
if (tmp == 24 && u == 4) {
str_=note;
return true;
}
for (int i = 0; i < 4; i ++) {
if (visit[i] == false) {
visit[i] = true;
// 加减乘除当前数字num[i]
int numCur=map.get(nums[i]);
boolean flag=note.equals("");
if ( dfs(u + 1,flag?numCur:(tmp + numCur),flag?(nums[i]):(note+"+"+nums[i])) ||
dfs(u + 1,flag?numCur:(tmp - numCur),flag?(nums[i]):(note+"-"+nums[i])) ||
dfs(u + 1,flag?numCur:(tmp * numCur),flag?(nums[i]):(note+"*"+nums[i])) ||
dfs(u + 1,flag?numCur:(tmp / numCur),flag?(nums[i]):(note+"/"+nums[i]))) {
return true;
}
// 相当于回溯
visit[i] = false;
}
}
return false;
}
}
