题解 | #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;
    }
}

全部评论

相关推荐

Edgestr:没项目地址就干脆把那一栏删了呗
点赞 评论 收藏
分享
用微笑面对困难:实习我觉得去字节好一点,因为鹅的转正很困难,后面可以去鹅干长期
找实习记录
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务