题解 | #24点游戏算法#

24点游戏算法

https://www.nowcoder.com/practice/fbc417f314f745b1978fc751a54ac8cb

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        // 标准输入
        Scanner input = new Scanner(System.in);
        // 获取输入数组
        while (input.hasNextLine()) {
            String[] numStr = input.nextLine().split(" ");
            // 将字符串数组转成双浮点数组后再处理
            double[] nums = new double[numStr.length];
            for (int i = 0; i < numStr.length; i++) {
                nums[i] = Double.parseDouble(numStr[i]);
            }
            // 调用解析方法
            boolean ans = judgePoint24(nums);
            // 输出结果
            System.out.println(ans);
        }
    }

    // 使用递归判断输入数组能否计算出24点
    private static boolean judgePoint24(double[] nums) {
        // 设置递归出口
        if (nums.length == 1) {
            // 处理计算精度问题
            return nums[0] > 23.999 && nums[0] < 24.001;
        }

        // 任选两数,通过运算符组成第三个数,进行后续的24点运算
        // 此处不需考虑括号问题,因为是任选两数后所有运算符都参与,故有无括号的情况均包含在内
        for (int x = 0; x < nums.length - 1; x++) {
            for (int y = x + 1; y < nums.length; y++) {
                // 初始化标志位,记录是否能算出24
                boolean isValid = false;

                // 每次两数操作后,得到的新数组length-1
                // 删除两操作数中的后者,然后在前者的位置放置新得的运算结果
                double[] temp = new double[nums.length - 1];
                //copy待删除元素y的前部
                System.arraycopy(nums, 0, temp, 0, y);
                //copy待删除元素y的后部
                System.arraycopy(nums, y + 1, temp, y, temp.length - y);

                // 加法
                temp[x] = nums[x] + nums[y];
                isValid = isValid || judgePoint24(temp);

                // 减法(减与被减)
                temp[x] = nums[x] - nums[y];
                isValid = isValid || judgePoint24(temp);
                temp[x] = nums[y] - nums[x];
                isValid = isValid || judgePoint24(temp);

                // 乘法
                temp[x] = nums[x] * nums[y];
                isValid = isValid || judgePoint24(temp);

                // 除法(除与被除),除数不得为0
                if (nums[y] != 0) {
                    temp[x] = nums[x] / nums[y];
                    isValid = isValid || judgePoint24(temp);
                }
                if (nums[x] != 0) {
                    temp[x] = nums[y] / nums[x];
                    isValid = isValid || judgePoint24(temp);
                }

                // 计算完毕,若合法则返回
                if (isValid) {
                    return true;
                }
            }
        } // 双层循环结束

        // 不合法
        return false;
    }
}

全部评论

相关推荐

想去夏威夷的小哥哥在度假:5和6才是重点
点赞 评论 收藏
分享
牛客963010790号:为什么还要收藏
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务