华为机试题67-24点游戏算法

2023-10-27

描述

给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算

此题允许数字重复,如3 3 4 4为合法输入,此输入一共有两个3,但是每个数字只允许使用一次,则运算过程中两个3都被选取并进行对应的计算操作。

输入描述:

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

输出描述:

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

示例1

输入:

7 2 1 10

输出:

true


这题应该算是难题吧,LeetCode里就是难题,华为机试里竟然是中等题。

我的方法很笨,用的是递归。



解题思路:

题目描述输入4个数,判断是否能通过四则运算(需考虑括号情况)得到24。

这里的考虑括号情况其实是唬人了,括号的作用也就是加强运算的优先级,我们只要将4个数四则运算的所有的情况加以考虑就可以。

比如4个数为:4,1,8,7

通过四则运算(8-4)*(7-1)能得到24,这里的括号可有可无,这个结果无非是:

首先选择8和4,进行减法运算,得到4,然后这个4与原先未参与运算的1和7组成:4,1,7

然后选择7和1,进行减法运算,得到6,然后这个6与原先未参与运算的4组成:4,6

最后选择4和6,进行乘法运算,就得到24

这也就是上面所说的不用被括号迷糊的原因了。

实际上,4个数,我们首先选择其中2个数,进行加减乘除任一运算,此时的运算结果再与原来未参加运算的2个数组成新的3个数,在3个数的基础上,判断通过四则运算是否能够得到24。通过以上分析,我们会想到利用递归来解题。递归都需要设置边界条件,这里的边界条件很简单,就是只剩1个数参与四则运算的时候,这个数就是4个数通过四则运算得到的最终结果,只需要判断其是否等于24即可;还有一些细节需要注意,比如说:

1、除数不能为0,进行除法运算的时候需要提前判断

2、实数除法运算是有较小误差的,结果不一定就等于24,只要结果与24误差足够小就能认为运算结果就是24,可以利用库函数fabs来求解两实数间的误差绝对值

3、如果某次运算结果不等于24,注意恢复运算前的数据,比如只剩2个数:4和6时,先试探加法得到10,将结果改为10和10001(此数说明为无效数),发现10不等于24,这次递归结束后,需要恢复成原来的4和6,同理进行减法运算得不到24,再恢复,进行乘法发现得到24,就可以结束了。

代码如下:

#include <stdio.h>
#include <math.h>
#define    MAX    10001        //用以表示无效数,因为4个数都不大于10,累乘也不过10000
int dfs(double num[])
{
    int i,j,cnt=0;
    double a,b;
    for(i=0;i<4;i++)
    {
        if(num[i]!=MAX)
            cnt++;            //cnt用来记录此次运算有几个数
    }
    if(cnt==1)                //只有一个数时,判断是否为24
    {
        for(i=0;i<4;i++)
        {
            if(num[i]!=MAX)
                if(fabs(num[i]-24)<=1e-6)
                    return 1;        //是24,返回1
                else
                    return 0;        //不是24,返回0
        }
    }
    else
    {
        for(i=0;i<4;i++)                
        {
            if(num[i]!=MAX)            //有效数才能参与运算
            {
                for(j=0;j<4;j++)
                {
                    if(i==j||num[j]==MAX)    //每个数只能被计算1次
                        continue;
                    a=num[i];
                    b=num[j];
                    
                    num[i]=a+b;        //加法运算,存储运算结果
                    num[j]=MAX;        //另一个数改为无效数
                    if(dfs(num))
                        return 1;
                    num[i]=a;      //若没有return,表示加法结果得不到24,恢复加法运算前的数字
                    num[j]=b;
                
                    num[i]=a-b;        //继续试探减法运算,下同
                    num[j]=MAX;
                    if(dfs(num))
                        return 1;
                    num[i]=a;
                    num[j]=b;
                
                    if(b!=0)
                    {
                        num[i]=a/b;
                        num[j]=MAX;
                        if(dfs(num))
                            return 1;
                        num[i]=a;
                        num[j]=b;
                    }
                
                    num[i]=a*b;
                    num[j]=MAX;
                    if(dfs(num))
                        return 1;
                    num[i]=a;
                    num[j]=b;
                }  
            }

        }
    }
    return 0;         //对于这次的有效数字,每轮四则运算都得不到24,返回0
}
int main()
{
    int i,temp;
    double num[4];
    for(i=0;i<4;i++)
    {
        scanf("%d",&temp);   //题目要求输入4个整数,这里转换成浮点数,不然后续的除法运算会出错
        num[i]=temp*1.0;
    }
    if(dfs(num))
        printf("true\n");
    else
        printf("false\n");
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

华为机试题67-24点游戏算法 的相关文章

  • 图像配准的方法

    转自 http blog sina com cn s blog 4b9b714a0100d5k5 html 图像配准的方法 1 基于特征的图像配准 基于特征的图像配准首先提取图像信息的特征 然后以这些特征为模型进行配准 特征提取的结果是一含
  • QT的ui文件中控件在cpp的调用

    点击然后右键 然后点击改变对象名称 改成如上图所示 即可在cpp函数中调用 进行操作
  • cdn搭建原理_什么叫cdn服务器?怎么部署?

    在现今的网络系统时期 各类互连网手机app异军突起 而互联网出現浏览卡屏或延时的状况也越来越非常广泛 以便处理不一样的互联网情况 人们常常会构建到不一样的虚拟主机来浏览互联网 cdn服务器也是列举这种 什么叫cdn服务器 cdn服务器英语全

随机推荐

  • CentOS7.x安装VNC实录

    不知不觉 centos已经到7 6了 在服务器操作系统中 centos是用的比较多的 占很大的比例 由于7 x版本和6 x版本有区别 最近安装了7 6的VNC 特记之 VNC需要系统安装的有桌面 如果是生产环境服务器 安装时使用的最小化安装
  • 学妹问我:OpenJDK是什么?作为师哥,必须万字详解屁颠屁颠奉上

    上一篇是分享的是 JVM虚拟机 了解Java堆中对象分配 布局和访问的全过程 这篇给大家分享 OpenJDK 1 OpenJDK 概述 OpenJDK 是 Java 平台标准版 Java SE 的免费开源实现 这是 Sun Microsys
  • python爬虫安装Xpath插件时遇到的问题

    在安装Xpath时 出现拖拉压缩包 记住一定是压缩包 下载后的插件是 crx后缀的文件 需要改变为压缩包的形式 后 在添加文件时 一直找不到压缩包 最后发现是压缩包后缀的问题 如图 是我的winr 压缩包软件 自动生成的压缩包 默认是rar
  • 数据聚合与分组运算

    标注 我用的是jupyterNotebook 一 分组与聚合的原理 在Pandas中 分组是指使用特定的条件将原数据划分为多个组 聚合在这里指的是 对每个分组中的数据执行某些操作 最后将计算的结果进行整合 分组与聚合的过程大概分为以下三步
  • nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet

    问题描述 这个报错指的是结果无法映射 只需要把java实体与数据库表关系映射好就ok 一定要看清自己的配置文件 自己的数据库 处理思路整理 避免走弯路 1 首先验证是不是代码写出 String sql select count 1 from
  • Spring中@Autowired注解用法详解

    1 概述 Spring中IOC可以通过注解方式实现 只要在spring的配置文件applicationContext xml中配置开启了包扫描Spring会自动扫描指定包及其子孙包
  • 【Python三大结构练习2】

    目录 1 数字金额转换为中文大写金额 2 恺撒密码 3 大小写转换 1 数字金额转换为中文大写金额 描述 编写一函数 将数字金额转换为中文大写金额 设最高位考虑到亿 最低位考虑到分 如 数字金额为1023 445 转换为中文大写金额为 壹仟
  • tp6整合腾讯云cos上传

    1 创建一个名为 composer json的文件 内容如下 require qcloud cos sdk v5 gt 2 0 2 执行以下命令 使用 Composer 安装 php composer update 3 复制代码 我这里目录
  • Qt编写并且调用外部动态库(dll)

    一 利用Qt编写一个简单的动态库 利用Qt编写一个简单的动态库 里面含有加 减 乘 除四个函数接口 1 打开Qt 新建一个项目 选择Library C 库 然后点击确认 2 选择共享库 写入项目名称 我这里命名为 QtMathDLL 选择项
  • Java 多线程批量操作中如何做事务控制?

    老汉聊技术 2023 04 11 12 43 发表于四川 收录于合集 java42个 编程63个 上方蓝色 老汉聊技术 选择 设为星标 前言 公司业务中遇到一个需求 需要同时修改最多约5万条数据 而且还不支持批量或异步修改操作 于是只能写个
  • 启动Redis报错:Could not create Server TCP listening socket *:6379: bind: Address already in use–解决办法

    最后一句提示 6379地址已经在使用 6379是redis默认的端口 如图我自己输入指令 redis server 显示Redis已经开启服务 1 正常解决方法三部 通过指令找到redis进程 查看所有关于它的进程详情 ps ef grep
  • Harbor-私有docker仓库离线安装配置

    因为工作需要 有时候是需要完全断网环境 此时需要在内网环境中离线安装Harbor私有仓库 1 系统环境描述 主机 X86 64架构 8G内存 期待啥时候等有机会找一台国产化机器安装一个其他架构的版本 操作系统 CentOS 7 9 2009
  • Python爬虫进阶:实战案例与技巧详解

    导言 Python作为一种强大的编程语言 在网络爬虫开发中发挥着重要作用 除了基本的爬虫技巧外 还有许多高级的爬虫技术可以帮助我们更好地获取和处理数据 本篇文章将结合实际案例 介绍Python爬虫的进阶技巧 并提供相应的代码示例 帮助读者深
  • 练习一、用JS语言计算两点之间距离功能

    功能描述 在界面建立4个数字输入框分别代表两点的横坐标 纵坐标 点击按钮并计算出相应的距离 主要考点 熟悉math对象中开根号math sqrt 数值 与平方math pow 数值 次幂 框架 elementui 相关代码
  • Netty学习——整体架构

    Netty 整体结构 Netty 是一个设计非常用心的网络基础组件 Netty 官网给出了有关 Netty 的整体功能模块结构 却没有其他更多的解释 从图中 我们可以清晰地看出 Netty 结构一共分为三个模块 Core 核心层 Core
  • Coverity介绍以及典型缺陷说明

    Coverity概述 Coverity公司是由一流的斯坦福大学的科学家于2002年成立的 产品核心技术是1998年至2002年在斯坦福大学计算机系统实验室开发的 用于解决一个计算机科学领域最困难的问题 在2003年发布了第一个能够帮助Lin
  • 一元多项式相加可实现代码数据结构(C语言)

    一元多项式相加可实现代码 c语言 数据结构 C语言版 书上是伪代码 经过不断修改调试 写下可实现的C语言源代码 创建文件 分为两部分 头文件 Poly h 和源文件 Poly c 一 实验目的 1 了解一元多项式的表示 2 实现一元多项式的
  • python使用influxdb-client管理InfluxDB的bucket

    bucket的概念类似数据库的 库 同时每个库中的数据都因为存在 时间戳 每个数据都会有一个对应的时间点 influxdb client python官方github页面 https github com influxdata influx
  • termux基本使用教程[通俗易懂]

    初始化 下载并初始化termux 安装vim 安装编辑器vim pkg install vim 解决中文乱码问题 在home目录下 新建 vimrc文件 vim vimrc 添加内容如下 set fileencodings utf 8 gb
  • 华为机试题67-24点游戏算法

    描述 给出4个1 10的数字 通过加减乘除运算 得到数字为24就算胜利 除法指实数除法运算 运算符仅允许出现在两个数字之间 本题对数字选取顺序无要求 但每个数字仅允许使用一次 且需考虑括号运算 此题允许数字重复 如3 3 4 4为合法输入