首页 > 编程语言 >HJ67 24点游戏算法

HJ67 24点游戏算法

时间:2023-07-25 12:11:22浏览次数:40  
标签:24 return nums int 算法 HJ67 calc public

1. 题目

读题

 HJ67 24点游戏算法

 

考查点

 

2. 解法

思路

 

代码逻辑

 

具体实现

import java.util.Scanner;
import java.util.Arrays;

public class HJ67 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int[] nums = new int[4];
            for (int i = 0; i < 4; i++) {
                nums[i] = sc.nextInt();
            }
            System.out.println(solve(nums));
        }
        sc.close();
    }

    public static boolean solve(int[] nums) {
        Arrays.sort(nums); // 排序
        do {
            if (check(nums)) return true; // 检查当前排列是否满足条件
        } while (nextPermutation(nums)); // 生成下一个排列
        return false;
    }

    public static boolean check(int[] nums) {
        for (int i = 0; i < 4; i++) { // 枚举第一个运算符
            for (int j = 0; j < 4; j++) { // 枚举第二个运算符
                for (int k = 0; k < 4; k++) { // 枚举第三个运算符
                    double a = calc(nums[0], nums[1], i); // 计算第一个表达式
                    double b = calc(a, nums[2], j); // 计算第二个表达式
                    double c = calc(b, nums[3], k); // 计算第三个表达式
                    if (Math.abs(c - 24) < 1e-6) return true; // 如果结果等于24,返回true

                    a = calc(nums[0], nums[1], i); // 计算第一个表达式
                    b = calc(nums[2], nums[3], k); // 计算第三个表达式
                    c = calc(a, b, j); // 计算第二个表达式(考虑括号)
                    if (Math.abs(c - 24) < 1e-6) return true; // 如果结果等于24,返回true
                }
            }
        }
        return false;
    }

    public static double calc(double x, double y, int op) { // 根据运算符计算两个数的结果
        switch (op) {
            case 0: return x + y;
            case 1: return x - y;
            case 2: return x * y;
            case 3: return x / y;
            default: return 0;
        }
    }

    public static boolean nextPermutation(int[] nums) { // 生成下一个排列(字典序)
        int n = nums.length;
        int i = n - 2;
        while (i >= 0 && nums[i] >= nums[i + 1]) { // 找到第一个逆序对
            i--;
        }
        if (i >= 0) { // 如果不是最后一个排列
            int j = n - 1;
            while (j > i && nums[j] <= nums[i]) { // 找到第一个大于nums[i]的数
                j--;
            }
            swap(nums, i, j); // 交换两个数
        } else { // 如果是最后一个排列,返回false
            return false;
        }
        reverse(nums, i + 1, n - 1); // 反转后面的部分
        return true;
    }

    public static void swap(int[] nums, int i, int j) { // 交换数组中两个数的位置
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

    public static void reverse(int[] nums, int i, int j) { // 反转数组中一段区间的元素
        while (i < j) {
            swap(nums, i, j);
            i++;
            j--;
        }
    }
}

自行实现 

3. 总结

标签:24,return,nums,int,算法,HJ67,calc,public
From: https://www.cnblogs.com/shoshana-kong/p/17548702.html

相关文章

  • 拆解雪花算法生成规则
    1介绍雪花算法(Snowflake)是一种生成分布式全局唯一ID的算法,生成的ID称为SnowflakeIDs或snowflakes。这种算法由Twitter创建,并用于推文的ID。目前仓储平台生成ID是用的雪花算法修改后的版本。雪花算法几个特性生成的ID分布式唯一和按照时间递增有序,毫秒数在高位,自增序列在低......
  • 20230724练习总结
    CF627F这个题的题面翻译其实就已经把做法提示得很明显了。每一次操作相当于是把\(0\)移动到相邻的节点上。考虑不加边,那接判断\(0\)移到后是否相同即可。现在要加一条边,可以先把\(0\)移动到位,判断是否相等。可以观察到如果加一条边影响的应该是一个环——顺移一个位置......
  • 基于协同过滤推荐算法-手语学习系统-项目实战
    我发布此篇文章有两个博客地址博客园:https://www.cnblogs.com/liuyangjava/p/17579030.htmlCSDN:https://blog.csdn.net/caleb_520/article/details/131899297?spm=1001.2014.3001.5502课程视频预览:【【毕设项目】基于协同过滤推荐算法-手语学习系统/2023年新课程】https://www......
  • Java3DES双倍长加密算法详解
     Java3DES双倍长加密算法是一种强大的加密算法,它可以保护我们的敏感数据不被未经授权的人访问。在本文中,我将详细介绍Java3DES双倍长加密算法的原理和使用方法。首先,让我们来了解一下Java3DES双倍长加密算法的原理。这种算法是基于DES(DataEncryptionStandard)算法的改进版本......
  • 左神算法-基础06-图
    左神算法-基础06-图图的存储方式邻接表邻接矩阵如何表达图?生成图?//图的节点publicclassNode{publicintvalue;//入度publicintin;//出度publicintout;publicArrayList<Node>nexts;publicArrayList<Edge>edges;......
  • 2023.7.24
    今天有事,所以也没看多少。看了ret2VDSO,ctfwiki上讲的很简略,原理甚至只有“待补充”几个字。我去看了最下面贴的两个链接,第一个链接全是英文,有点不太想看,第二个链接和ctfwiki上的一模一样。感觉好像这块和之前的ret2reg差不多,都不是特别重要的部分。明天去看SROP......
  • 文心一言 VS 讯飞星火 VS chatgpt (65)-- 算法导论6.5 4题
    四、在MAX-HEAP-INSERT的第2行,为什么我们要先把关键字设为-∞,然后又将其增加到所需的值呢?文心一言:在MAX-HEAP-INSERT算法的第二行将关键字设为-∞,是为了保持堆的性质。堆是一种二叉树结构,其中每个节点的值都大于或等于其子节点的值。在MAX-HEAP-INSERT算法中,我们需要在......
  • 算法练习-day29
    贪心算法435.无重叠区间题意:给定一个区间的集合 intervals ,其中intervals[i]=[starti,endi] 。返回需要移除区间的最小数量,使剩余区间互不重叠 。实例:思路:本题和452.用最少数量的箭引爆气球做法非常类似,大家可以先看看我之前的文章。本题我们只需要统计重叠的区域,代码如......
  • 文心一言 VS 讯飞星火 VS chatgpt (65)-- 算法导论6.5 4题
    四、在MAX-HEAP-INSERT的第2行,为什么我们要先把关键字设为-∞,然后又将其增加到所需的值呢?文心一言:在MAX-HEAP-INSERT算法的第二行将关键字设为-∞,是为了保持堆的性质。堆是一种二叉树结构,其中每个节点的值都大于或等于其子节点的值。在MAX-HEAP-INSERT算法中,我们需要......
  • 7.24打卡
    L1-096谁管谁叫爹#include<bits/stdc++.h>usingnamespacestd;intdigit_sum(intnum){intsum=0;while(num){sum+=(num%10);num/=10;}returnsum;}intmain(){intN;inti,j;intA,B;cin>>N;for(i=0;i<N;......