类似"24点游戏算法"的原理,使用DFS搜索所有的可能组合,一旦找到符合要求的一种解就返回值,如果搜索不到就说明无符合要求的组合,
返回false.
import java.util.*;
public class Main {
    
    private 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);
    }};
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        if(str.contains("joker")){
            System.out.println("ERROR");
        }else{
            if(!dfs(str.split(" "), 0, "", 0)){
                System.out.println("NONE");
            }
        }
    }
    
    public static boolean dfs(String[] nums, int res, String exp, int n){
        for(int k = 0; k < nums.length; k++){
            String temp = nums[k];
            if(!temp.equals("")){
                nums[k] = "";    //已经使用过的牌标记为空字符串""
                int a = map.get(temp);
                if(n == 0){   
                    if(dfs(nums, a,  exp + temp, n+1)||
                       dfs(nums, a,  exp + temp, n+1) || 
                       dfs(nums, a, exp + temp, n+1) ||
                       dfs(nums, a,  exp + temp, n+1) ){
                         return true;
                    }
                }else{
                    if(dfs(nums, res + a,  exp + "+" + temp, n+1) ||
                       dfs(nums, res - a,  exp + "-" + temp, n+1) || 
                       dfs(nums, res * a, exp + "*" + temp, n+1) ||
                       dfs(nums, res / a,  exp + "/" + temp, n+1) ){
                         return true;
                    }
                }
                nums[k] = temp; //恢复现场
            }
        }
        if(res == 24 && n == nums.length){
            System.out.println(exp);
            return true;
        }
        return false;
    }
    
}