题解 | #24点运算#
24点运算
https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Stack;
//递归栈
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
static Map<String, Integer> hashmap = new HashMap<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) {
String[] s = in.nextLine().split(" ");
for (int i = 0 ; i < 8 ; ++i) {
hashmap.put((char)('2' + i) + "", i + 2);
}
hashmap.put("10", 10);//注意该情况
hashmap.put("J", 11);
hashmap.put("Q", 12);
hashmap.put("K", 13);
hashmap.put("A", 1);
int[] nums = new int[4];
for(int i=0 ; i<4 ; ++i){
//System.out.println(s[i]);
if(!hashmap.containsKey(s[i])){
System.out.println("ERROR");
return;
}
else{
nums[i] = hashmap.get(s[i]);
}
}
boolean[] visited = new boolean[4];
Stack<String> stack = new Stack<>();
for(int i=0 ; i<nums.length ; ++i){
stack.push(s[i]);
visited[i] = true;
int value = nums[i];
help24(nums, visited, value, stack);
if(flag){
System.out.println(ans.toString());
return;
}
visited[i] = false;
stack.pop();
}
System.out.println("NONE");
}
}
static boolean flag = false;
static String ans = "";
public static void help24(int[] nums, boolean[] visited, int value, Stack<String> stack){
if(stack.size()==4 && value == 24){
//System.out.println(stack);
List<String> list = new ArrayList<>();
while(!stack.isEmpty()){
list.add(stack.pop());
}
for(int i=list.size()-1 ; i>=0 ; --i){
ans+=list.get(i);
}
flag=true;
}
if(flag){
return;
}
for(int i=0 ; i<nums.length ; ++i){
if(!visited[i]){
visited[i] = true;
stack.push("*"+nums[i]);
help24(nums, visited, value*nums[i], stack);
if(flag) return;
stack.pop();
stack.push("/"+nums[i]);
help24(nums, visited, value/nums[i], stack);
if(flag) return;
stack.pop();
stack.push("+"+nums[i]);
help24(nums, visited, value+nums[i], stack);
if(flag) return;
stack.pop();
stack.push("-"+nums[i]);
help24(nums, visited, value-nums[i], stack);
if(flag) return;
stack.pop();
visited[i] = false; //遍历当前节点完毕
}
}
}
}

