华为OD机试真题B卷 Java 实现【24点游戏算法】,附详细解题思路

news/2024/7/24 11:41:41 标签: java, 算法, 华为, 开发语言, 学习

在这里插入图片描述

一、题目描述

给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算
此题允许数字重复,如3 3 4 4为合法输入,此输入一共有两个3,但是每个数字只允许使用一次,则运算过程中两个3都被选取并进行对应的计算操作。

二、输入描述

读入4个[1,10]的整数,数字允许重复,测试用例保证无异常数字。

三、输出描述

对于每组案例,输出一行表示能否得到24点,能输出true,不能输出false。

四、解题思路

  1. 首先读取输入的四个整数;
  2. 使用深度优先搜索(DFS)算法尝试所有可能的运算组合;
  3. 定义一个全局变量 flag,用于表示是否能得到结果为24的运算;
  4. 定义一个数组 nums 存储四个输入的整数;
  5. 定义一个布尔数组 visit,用于标记数字是否已经被使用过;
  6. 实现递归函数 dfs,函数参数为当前已经使用的数字个数 u 和运算的中间结果 tmp;
  7. 递归终止条件为已经使用了四个数字且结果为24,设置 flag 为1,表示能得到结果为24,返回 true;
  8. 遍历四个数字,如果数字没有被使用过,则将其标记为已使用,并尝试加减乘除四种运算;
  9. 如果通过递归调用可以得到结果为24,返回 true;
  10. 如果无法得到结果为24,则将当前数字标记为未使用,相当于回溯操作;
  11. 如果所有数字都尝试完毕后仍无法得到结果为24,返回 false;
  12. 在主函数中调用 dfs 函数,并输出 flag 的值;

五、Java算法源码

java">static int[] nums = new int[4];
static boolean[] visit = new boolean[4];
static int flag = 0;

public static void main(String[] args){
    Scanner in = new Scanner(System.in);
    while(in.hasNext()){
        String[] a = in.nextLine().split(" ");
        for(int i = 0; i < 4; i ++)
            nums[i] = Integer.parseInt(a[i]);
        dfs(0, 0);
        System.out.println( flag == 1 );
    }

}

// tmp是前面n个数字运算结果,u表示已经使用了多少个数字
static boolean dfs(int u,float tmp){
    // 递归终止条件:已经使用了数组四个元素,同时结果为24,满足题意
    if(tmp == 24 && u == 4){
        flag = 1;
        return true;
    }

    for(int i = 0; i < 4; i ++){
        if(visit[i] == false){
            visit[i] = true;
            // 加减乘除当前数字num[i]
            if( dfs(u + 1, tmp + nums[i]) ||
                    dfs(u + 1, tmp - nums[i])  ||
                    dfs(u + 1,tmp * nums[i]) ||
                    dfs(u + 1, tmp / nums[i])){
                return true;
            }
            // 相当于回溯
            visit[i] = false;
        }
    }
    return false;
}

六、效果展示

在这里插入图片描述


🏆下一篇:华为OD机试真题 Java 实现【基站维修工程师】【2023Q1 200分】,附详细解题思路

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

在这里插入图片描述


http://www.niftyadmin.cn/n/376916.html

相关文章

LaTeX minted报错Package minted Error: Missing Pygments output

在确认已使用pip install Pygments命令安装好Pygments包并在 TEX 文件的开头添加了 \usepackage[utf8]{inputenc} \usepackage[english]{babel} \usepackage[cachefalse]{minted}后&#xff0c;使用pdflatex -shell-escaped WA1.tex命令编译 TEX 文件报错&#xff1a; (./_min…

uni-app生命周期有哪些?怎么理解?

uni-app生命周期有哪些&#xff1f;怎么理解&#xff1f; uni-app生命周期有哪些&#xff1f;怎么理解&#xff1f; 文章目录 uni-app生命周期有哪些&#xff1f;怎么理解&#xff1f;前言一、什么是生命周期函数&#xff1f;二、uni-app生命周期分类总结 前言 UNI-APP学习系…

mysql中的count(1)、count(*)、count(id)哪个更快?

今天和大家聊一下mysql中的count()方法 我们日常开发中&#xff0c;经常会用到count()命令&#xff0c;有的人用count(*)&#xff0c;有的人用count(1)&#xff0c;还有的人用count(id)&#xff0c;那么这几种写法都有什么区别呢&#xff1f;哪种方法效率更高呢&#xff1f;今…

深度学习实战项目(三)-行人检测重识别yolov5+reid(跑通+界面设计)

行人检测重识别yolov5reid&#xff08;跑通界面设计&#xff09; 参考源代码: github 权重文件&#xff1a; 根据github上面的网盘进行权重下载&#xff1a; 检测&#xff1a;将 ReID_resnet50_ibn_a.pth放在person_search/weights文件下&#xff0c;yolov5s.pt放person_sear…

【深度学习】【人脸检测模型】SCRFD模型的训练与部署实战

文章目录 Linux安装环境pythoninsightface环境 训练数据集准备todo 训练 Linux安装环境 python 我的cuda版本11.6&#xff1a; $ nvcc --version nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2022 NVIDIA Corporation Built on Tue_Mar__8_18:18:20_PST_2022…

Ctfshow基础二刷(1)

前言&#xff1a; 前两天的信安给我整emo了&#xff0c;头一回打正经比赛&#xff0c;结果发现基础太差&#xff0c;代码审计烂得一踏糊涂。 寻思寻思&#xff0c;从头整一遍基础。又买了安恒出的新书。争取7号去吉林打省队选拔不给导儿丢脸吧呜呜 文件包含 web78: 这题一…

谷歌训了28个15亿参数模型,说明数据对大模型训练的影响

夕小瑶科技说 原创 作者 | Python 随着ChatGPT的爆火&#xff0c;大规模语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;如日中天。然而&#xff0c;由于相关数据细节并不公开&#xff0c;相关研究大多都是盲人摸象式探索&#xff0c;缺乏系统的经验指导…

7.Ansible Modules介绍

什么是Ansible Modules? Ansible模块根据其功能分为不同的组&#xff0c;每个模块提供了一些功能&#xff0c;可以直接使用。 模块官方文档: https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html 系统模块是要在系统级别执行的操作,例如修改系统上的用户…