题解 | #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; //遍历当前节点完毕 } } } }