题解 | #24点运算#

24点运算

https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d

使用DFS + 牌随机排序尝试计算50次

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息

public class Main {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        while (in.hasNextLine()) {

            String inputData = in.nextLine();

            if(inputData.contains("joker") || inputData.contains("JOKER")) {

                System.out.println("ERROR");

                return;

            }

            String[] paiArray = inputData.split(" ");

            int tryCalNum = 0;

            boolean opResult = false;

            while(!opResult && tryCalNum < 50) {//暂时猜测计算50次一定得出结果,超出50次说明不能计算出24

                String[] paiRandomArray = new String[paiArray.length];//保存牌的随机顺序值

                int[] randomArray = getRandom();

                for(int i = 0; i < paiRandomArray.length; i ++) {

                    paiRandomArray[i] = paiArray[randomArray[i]];

                }

                int lastCalResult = getPaiRealVal(paiRandomArray[0]);

                StringBuilder opeSb = new StringBuilder();

                opResult = dfs(paiRandomArray, 0, lastCalResult, opeSb);

                opeSb.insert(0, paiRandomArray[0]);

                if(opResult) {

                    //计算成功24

                    System.out.println(opeSb.toString());

                    break;

                }

                tryCalNum ++;

            }

            if(!opResult) {

                System.out.println("NONE");

            }

        }    

    }

    //深度优先搜索算法

    private static boolean dfs(String[] paiArray, int index, int lastCalResult, StringBuilder opeSb) {

        if(index == paiArray.length - 1 && lastCalResult == 24) {

            return true;

        }

        if(index + 1 <= paiArray.length - 1) {

            //加

            boolean result = dfs(paiArray, index + 1, lastCalResult + getPaiRealVal(paiArray[index + 1]), opeSb);

            if(result) {

                opeSb.insert(0, "+" + paiArray[index + 1]);

                //opeSb.append(getPaiRealVal(paiArray[index + 1]));

                return result;

            }

            //减

            result = dfs(paiArray, index + 1, lastCalResult - getPaiRealVal(paiArray[index + 1]), opeSb);

            if(result) {

                opeSb.insert(0, "-" + paiArray[index + 1]);

                //opeSb.append(getPaiRealVal(paiArray[index + 1]));

                return result;

            }

            //乘

            result = dfs(paiArray, index + 1, lastCalResult * getPaiRealVal(paiArray[index + 1]), opeSb);

            if(result) {

                opeSb.insert(0, "*" + paiArray[index + 1]);

                //opeSb.append(getPaiRealVal(paiArray[index + 1]));

                return result;

            }

            //除

            int divResult = lastCalResult / getPaiRealVal(paiArray[index + 1]);

            int ysResult = lastCalResult % getPaiRealVal(paiArray[index + 1]);

            if(ysResult == 0) {

                //能被整除

                result = dfs(paiArray, index + 1, divResult, opeSb);

            } else {

                result = false;

            }

            if(result) {

                opeSb.insert(0, "/" + paiArray[index + 1]);

                //opeSb.append(getPaiRealVal(paiArray[index + 1]));

                return result;

            }

        }

        return false;

    }

    //获取牌的实际值

    public static int getPaiRealVal(String pai) {

        int result = 0;

        switch(pai) {

            case "2":

            case "3":

            case "4":

            case "5":

            case "6":

            case "7":

            case "8":

            case "9":

            case "10": result = Integer.valueOf(pai); break;

            case "J":  result = 11; break;

            case "Q":  result = 12; break;

            case "K":  result = 13; break;

            case "A":  result = 1; break;

        }

        return result;

    }

    //随机生成4个0到3不同的数

    public static int[] getRandom() {

        int[] resultData = new int[4];

        boolean[] findFlag = new boolean[4];

        int calData = (int)(Math.random() * (3 - 0 + 1) + 0);

        for(int i = 0; i < resultData.length; i ++) {

            while(findFlag[calData]) {

                calData = (int)(Math.random() * (3 - 0 + 1) + 0);

            }

            findFlag[calData] = true;

            resultData[i] = calData;

        }

        return resultData;

    }

}

全部评论

相关推荐

找个工作&nbsp;学历是要卡的&nbsp;要求是高的&nbsp;技能不足是真的&nbsp;实习经验是0的&nbsp;简历无处可写是事实的&nbsp;钱不好赚是真的&nbsp;想躺平又不敢躺&nbsp;也不甘心躺&nbsp;怕自己的灵感和才华被掩埋甚至从未被自己发现&nbsp;又质疑自己是否真正有才华
码农索隆:你现在啊,你心里都明白咋回事,但是你没办法改变现状,一想到未来,你又没有信心狠下心来在当下努力。 得走出这种状态,不能一直困在那里面,哪不行就去提升哪,你一动不动那指定改变不了未来,动起来,积少成多才能越来越好
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 18:05
点赞 评论 收藏
分享
06-12 10:50
门头沟学院 Java
你的不定积分没加C:我怎么在学院群看到了同样的话
点赞 评论 收藏
分享
风中翠竹:真的真的真的没有kpi。。。面试官是没有任何kpi的,捞是真的想试试看这个行不行,碰碰运气,或者是面试官比较闲现在,没事捞个人看看。kpi算HR那边,但是只有你入职了,kpi才作数,面试是没有的。
双非有机会进大厂吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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