“24点”计算问题的算法分析和C++语言实现

C++ 24点游戏算法 原题链接:24点游戏算法_牛客题霸_牛客网 描述 给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算 此题允许数字重复,如3 3 4 4为合法输入,此输入一共有两个3,但是每个数字只允许使用一次,则运算过程中两个3都被选取并进行对应的计算操作。 输入描述: 读入4个[1,10]的整数,数字允许重复,测试用例保证无异常数字。 输出描述: 对于每组案例,输出一行表 阅读详情

一、题目描述

给你四个数字 A 1 , A 2 , A 3 , A 4 A_1,A_2,A_3,A_4 A1​,A2​,A3​,A4​ ,请使用加、减、乘、除和括号来实现 24 24 24 点问题的计算。

规则如下:

  1. 每个数字只能使用一次。
  2. 若需要使用除法,则过程中不能出现小数。例如: ( 2 × 2 ) ÷ 4 + 2 (2 \times 2) \div 4 + 2 (2×2)÷4+2 是一个合法的表达式,但 2 ÷ 4 × 2 2 \div 4 \times 2 2÷4×2 则不是一个合法的表达式,即使它的最终计算结果是一个整数。
  3. 最终的计算结果应该是 24 24 24 ,输出字典序最小的操作序列。

数据范围: 1 ≤ A i ≤ 9 ( 1 ≤ i ≤ 4 ) 1 \le A_i \le 9(1 \le i \le 4) 1≤Ai​≤9(1≤i≤4) 。
一道除了输出不同但类似的题:算 24 24 24 点

二、算法原理

由于本题的计算只涉及到 4 4 4 个数字 A 1 , A 2 , A 3 , A 4 A_1,A_2,A_3,A_4 A1​,A2​,A3​,A4​ 所以可以使用 dfs 算法进行计算。

1. 搜索框架

   搜索对象:数字 A 1 , A 2 , A 3 , A 4 A_1,A_2,A_3,A_4 A1​,A2​,A3​,A4​
   搜索内容:使用运算符 + , − , × , ÷ , ( ) +,-,\times,\div,() +,−,×,÷,() 连接四个数字

2. 具体的搜索实现方法

(1) 需要包含的头文件:

#include <iostream>
#include <string>
//或者使用下面这个,注意命名重复的问题,不要使用 map, x1, x2 等变量名
#include <bits/stdc++.h>

    提醒:在比赛的时候,尽量不要使用 bits/stdc++.h 这个库,否则可能会出现各种意想不到的问题。由于比赛评测机是 Linux 环境,编译规则与 Windows 有所不同。

(2) 定义数组和变量:

int a[8]; //用来存储输入的数字
int v[8]; //用来在搜索过程中记录每个数字是否被使用过,避免重复搜索
string s[8]; //记录运算过程中产生的表达式,其中的每个 string 记录这一次运算后的整个表达式
string ans; //用来存储字典序最小的答案

(3) 搜索过程的文字描述:

   首先,我们直接从输入数组的末端( 4 4 4 号位置)开始搜索。设已经搜索到了第 p p p 号位置,则每次搜索的过程,枚举从第 1 1 1 到第 p p p 个位置的元素中未参与运算的两个元素。这里, p p p 可以大于 4 4 4 ,此时 A p A_p Ap​ 表示每一次运算后的结果。如果找到了这样的两个元素,记这两个元素在集合 A A A 中的位置分别为 i , j i,j i,j 。枚举可以对 ( A i , A j ) (A_i,A_j) (Ai​,Aj​) 数对进行的四则运算。
   然后,对于每个运算,采用如下的处理方式:
   标记位置 i , j i,j i,j 为使用过,令新位置 A p + 1 A_{p+1} Ap+1​ 的值为 A i  op  A j   ( op ∈ { + , − , × , ÷ } ) A_i \text{ op } A_j \text{ } (\text{op} \in \{+,-,\times,\div\}) Ai​ op Aj​ (op∈{+,−,×,÷}) ,令 s p + 1 s_{p+1} sp+1​ 的值为 "(" + s[i] + op + s[j] + ")" , op ∈ { + , − , × , ÷ } \text{op} \in \{+,-,\times,\div\} op∈{+,−,×,÷} 。在使用除法时特判:如果能被整除,则进行上述的操作。注意除数可能是 0 0 0 !
   最后,我们需要判断是否到达递归出口。如果 p p p 的值是 7 7 7 ,因为 4 4 4 个数之间只能进行 3 3 3 次运算,所以到达递归出口,判断 A p A_p Ap​ ,也就是最后的运算结果是否是 24 24 24 。如果是,则满足记录答案的条件 ,用记录答案的字符串 ans 记录当前的操作序列。注意, ans 在非空的状态下需要与 S p S_p Sp​ 进行取最小值的运算来获得字典序最小的答案。

(4) 搜索过程的代码实现:

void dfs(int p) //p的含义如上
{
	if (p == 7) //完成全部运算,到达递归出口
	{
		if (a[p] == 24) //最终的运算结果是 24
		{
			if (ans == "") //变量 ans 中尚未记录答案
			{
				ans = s[p]; // ans 为当前的操作序列
			}
			else
			{
				ans = min(ans, s[p]); //取字典序最小,字符串支持 < 操作
			}
		}
		
		return ; //返回
	}
	
	for (int i = 1; i <= p; ++i) //枚举第一个操作数
	{
		if (v[i]) continue; //如果被使用过,则直接退出
		v[i] = 1; //标记为使用过
		
		for (int j = 1; j <= p; ++j) //枚举第二个操作数
		{
			if (v[j]) continue; //第二个数不能被使用过
			if (i == j) continue; //两个数不能相同
			v[j] = 1; //标记为使用过
			
			//枚举四种运算
			//加法
			a[p + 1] = a[i] + a[j];
			s[p + 1] = "(" + s[i] + "+" + s[j] + ")";
			dfs(p + 1);
			//减法
			a[p + 1] = a[i] - a[j];
			s[p + 1] = "(" + s[i] + "-" + s[j] + ")";
			dfs(p + 1);
			//乘法
			a[p + 1] = a[i] * a[j];
			s[p + 1] = "(" + s[i] + "*" + s[j] + ")";
			dfs(p + 1);
			//除法,特判
			if (a[j] != 0 && a[i] % a[j] == 0)
			{
				a[p + 1] = a[i] / a[j];
				s[p + 1] = "(" + s[i] + "/" + s[j] + ")";
				dfs(p + 1);
			}
			
			v[j] = 0; //回溯
		}
		
		v[i] = 0; //回溯
	}
}

(5) 搜索过程的图片解析

图片解析

三、C++ 语言代码实现及细节

注意 s 数组要初始化成 a 数组的字符形式即可。

#include <bits/stdc++.h>

using namespace std;

const int N = 10;

int a[N], v[N];
string s[N], ans;

void dfs(int p)
{
    if (p == 7)
    {
        if (a[p] == 24)
        {
            if (ans == "")
            {
                ans = s[p];
            }
            else
            {
                ans = min(ans, s[p]);
            }
        }
    }

    for (int i = 1; i <= p; ++i)
    {
        if (v[i]) continue;
        v[i] = 1;

        for (int j = 1; j <= p; ++j)
        {
            if (i == j) continue;
            if (v[j]) continue;

            v[j] = 1;

            a[p + 1] = a[i] + a[j];
            s[p + 1] = "(" + s[i] + "+" + s[j] + ")";
            dfs(p + 1);

            a[p + 1] = a[i] - a[j];
            s[p + 1] = "(" + s[i] + "-" + s[j] + ")";
            dfs(p + 1);

            a[p + 1] = a[i] * a[j];
            s[p + 1] = "(" + s[i] + "*" + s[j] + ")";
            dfs(p + 1);

            if (a[j] != 0 && a[i] % a[j] == 0)
            {
                a[p + 1] = a[i] / a[j];
                s[p + 1] = "(" + s[i] + "/" + s[j] + ")";
                dfs(p + 1);
            }

            v[j] = 0;
        }

        v[i] = 0;
    }
}

int main()
{
    for (int i = 1; i <= 4; ++i)
    {
        cin >> a[i];
        s[i] = (char)(a[i] + '0');
    }

    dfs(4);

    cout << ans << endl;

    return 0;
}
算法分析与设计课程实验——TSP问题与01背包问题的动态规划算法实现 前言:这门课程教材为清华出版社的算法设计与分析第二版,这本书上的代码,以及学校实验,实验报告,PTA实验编程题等资源,我都会放在Gitee仓库中。 new(albert)/算法分析与设计 /* * @Description: * @version: * @Author: * @Date: 2021-04-24 16:06:25 * @LastEditors: Please set LastEditors * @LastEditTime: 2021-04-24 18:28:26 */ // 重点理解子集的. 阅读详情

相关推荐

数据结构与算法分析C++版参考答案的正确打开方式:从抄答案到真正掌握

数据结构是计算机科学的核心基础,而算法分析则是衡量程序效率的关键能力。理解链表、树、图等基本结构及其操作原理,是进行高效编码和系统设计的必要前提。在工程实践中,面对复杂数据与性能要求,开发者需要具备选择合适数据结构与优化算法的能力,例如通过优先队列优化最短路径、利用并查集处理连通性问题。对于使用C++学习数据结构的开发者而言,参考经典教材的习题解答可以成为校验思路、补足盲区的辅助工具,但关键在于掌握“先独立实现、再对照复盘”的方法。本文围绕《数据结构与算法分析C++语言描述第四版参考答案》的合理使用,讨论如

weixin_30321709的博客 387

C++ 实现计算24点

原理 暴力枚举所有的情况,运算符号4个,加减乘除 + - * / ,整数数字4个。所需要枚举的次数: 数字顺序:4个数的全排列,4! = 24。 运算符号:4个数需要3个符号,每个可选4种,43 = 64。 加括号方式:((AB)C)D、(A(BC))D、(AB)(CD)、A((BC)D)、A(B(CD)),共5种。 枚举次数 24*64*5 实现细节 全排列枚举由库函数 next_perm...

落叶秋风早的博客 1万+

计算24点C++源码(计算24点的C++源代码)

计算24点的C++源代码,里面用2种方式进行了10以内数字任取4个数算24点。 第一种是用递归的方式; 第二种方式采用后缀表达式。 更详细的思路说明及细节介绍请参考我的文章: http://blog.youkuaiyun.com/sun2043430/article/details/8739042

C++/Qt 计算24点

C++/Qt 计算24点 ​ 游戏的算法可描述如下:4个1-10的数字,用加、减、乘、除和括号把数子算成24,每个数字都必须使用到,且只能用一次。 ​ 用C++写会更加的方便: ​ 在这本书中要求了表达式中数字的顺序不能改变,所以在7.7节 中提供的算法不具有普遍适应性,但是算法的思路还是很简单并且清晰。不需要多动脑袋。在他的基础上,可以轻易的扩展成一般的算法。 一些比较难的24点计算 1 3 9 10 1 4 5 6 1 5 5 5 2 7 10 10 3 3 7 7 3 3

读书笔记 3423

智能安防摄像头埋点实践:用户行为与设备状态的闭环监控(含AI事件)

智能安防摄像头埋点闭环体系设计及应用实践 摘要: 本文系统阐述了智能安防摄像头埋点闭环体系的设计与实践。首先分析了传统埋点的不足及闭环埋点的价值,提出由用户行为埋点、设备状态埋点和AI事件埋点构成的三维埋点体系框架。详细介绍了闭环监控的四大流程:数据采集、汇聚清洗、分析建模和智能决策。通过误报优化、个性化策略等案例展示了AI事件闭环的实际应用价值,并探讨了隐私合规、性能优化等关键挑战的解决思路。最后展望了端侧AI增强、预测型埋点等未来发展趋势。该体系实现了从数据采集到业务决策的完整闭环,有效提升了AI模型性

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 1046

RT-2(robotics-transformer2)论文--阅读笔记

谷歌RT-2机器人论文的阅读笔记。

weixin_61255639的博客 1828

C++程序计算24点

本文用C++编写了一个24点程序,对于能算出24点的,输出一种计算表达式,如不能算也说明。

gxgdcyy的博客 3846

双有源桥(DAB)进阶:EPS调制策略与Matlab/Simulink仿真实践

本文深入探讨了双有源桥(DAB)的扩展移相(EPS)调制策略及其在Matlab/Simulink中的仿真实践。通过分析EPS的两种黄金调制策略——回流功率消除和电流应力优化,结合实际工程案例,展示了如何提升DAB系统的效率和性能。文章还详细介绍了Simulink模型搭建要点和关键仿真结果,为工程师提供了实用的技术参考。

weixin_33734785的博客 484

24点卡牌游戏C++实现

问题描述: 24点游戏是经典的纸牌益智游戏。 常见游戏规则: 从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。 基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。 1.程序风格良好(使用自定义注释模板) 2.列出表达式无重复。 提高要求:用户初始生命值为一给定值(比如3),初始分数为0。随机生成4个代表扑克牌.

HuanB123的博客 4276

【学习笔记】人群归因分数 PAF 以及combined PAF(更新)

在此推荐2篇发表在lancet以及jama子刊上的paf文章,这两篇文章套路是一样的,只是在不同国家进行。希望对大家学习PAF有所帮助,后面有新内容也会继续分享,也欢迎大家分享使用R语言计算PAF的经验~~~的时候,先建立了相关矩阵,再做主成分分析,得到communality。详细信息大家可翻阅原文。

weixin_53499537的博客 1498

华为昇腾Ascend C中级认证考试-tanh

注册昇腾社区账号后可以免费领券考试。

2600_96284887的博客 474

24点游戏

文章目录前言一、基本要求二、算法分析1.算法设计2.流程图三、源代码总结 前言 24点游戏是经典的纸牌益智游戏。 常见游戏规则: 从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。 提示:以下是本篇文章正文内容,下面案例可供参考 一、基本要求 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题 二、算法分析 1.算法设计 使用五个函数,将四个数字中两个两个一组进行不同的加减乘除运算,返回运算结果。再..

qq_54275216的博客 806

DolphinScheduler租户配置踩坑实录:手把手教你修复‘tenant not exists‘报错

本文深度解析DolphinScheduler的租户模型,并提供一套从界面到数据库的系统性排查流程,手把手教你修复常见的'tenant not exists'报错。文章揭示了该错误的本质是用户与租户数据关联不一致,并给出了通过UI或SQL更新的具体修复方案,同时分享了根因分析与预防措施,帮助用户从根本上理解和避免此类问题。

2w3e4r5t6y的博客 541

##24点游戏程序实现算法(文末源代码)

##24点游戏程序实现算法(文末源代码) 题目要求: 24点游戏是经典的纸牌益智游戏。 常见游戏规则: 从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。 基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。 1.程序风格良好(使用自定义注释模板) 2.列出表达式无重复。 提高要求:用户初始生命值为一给定值(比如3

mql6767521的博客 2464

[QMT量化交易小白入门]-二十四、年化收益47%的全球核心资产轮动策略(含代码解析)

m_days = 25 #动量参考天数period=200m_days被设置为25,表示动量参考的天数为25天;period被设置为200,用于指定获取市场数据的周期长度。

木头大左的博客 2969

04 Zabbix自定义触发器

1、触发器是什么 触发器表达式:允许定义一个什么状况的数据是“可接受”的阈值。因此,如果接收的数据超过了可接受的状态,则触发器会被触发 , 或将状态更改为异常。 一个触发器可以拥有下面几种状态: 值 描述 OK 这是一个正常的触发器状态。在旧版本的Zabbix中称为FALSE。 PROBLEM 通常意味着发生了某些事情。例如,处理器的负载较高。在旧版本的Zabbix中称为TRUE。 2、创建触发器TRIGGER 案例:系统超过3个用户登录,则告警。 2.1 开启告警声

Jian Sun_的博客 1540

hdu 1427 速算24点

速算24点 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3226 Accepted Submission(s): 775 Problem Description 速算24点相信绝大多数人都玩过。就是随...

weixin_34037977的博客 197

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++语言的重要性

C++语言简介 C++准确说是一门中级语言,介于汇编和高级语言之间吧,要求程序员了解计算机的内部数据存储。个人认为,作为学生还是花功夫学C++,因为《设计模式》《数据结构》这些课程基本上还 是C++应付的比较好,学习C++,认真阅读c++ primer,而后配合 The ADAPTIVE Communication Environment (ACE)了解设计模式, 再看看《深入浅出STL》,就

国旭 的专栏 3798

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C/C++数据结构实训任务(24题)[2023-12-08]

汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入:当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。学生要发挥自主学习的能力,充分利用时间,并在课程设计过程中不断检测自己的计划完成情况,及时向教师汇报。

程序设计 288

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数据结构精品电子书分享之《数据结构与算法分析–C++描述(第3版)》

书籍简介作者:(美)Mark Allen Weiss出版日期:2007 年1月出版社:人民邮电出版社页数:435ISBN:7115139238文件格式:PDF文件大小:24.48 MB本书是数据结构和算法分析的经典教材,书中使用主流的程序设计语言C++作为具体的实现语言。书的内容包括表、栈、队列、树、散列表、优先队列、排序、不相交集算法、图论算法、算法分析、算法设计、摊还分...

测试 1190

c++学习论坛推荐

本文为大家推荐一些c++学习论坛,让大家找到相互学习的平台,希望对一些计算机编程者和对c++感兴趣的人有一些帮助。 C/C++是最主要的编程语言。这里列出了50名优秀网站和网页清单,这些网站提供c/c++源代码。这份清单提供了源代码的链接以及它们的小说明。我已尽力包括最佳的C/C++源代码的网站。这不是一个完整的清单,您有建议可以联系我,我将欢迎您的建议,以进一步加强这方面的清单。 1、Aian...

changkang_woo的专栏 2369

c语言调用cpp函数_C语言函数学习-函数的递归调用

文章logo函数的递归调用一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。C语言允许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。例如有函数f如下: int f(int x) { int y; z=f(y); return z;}这个函数是一个递归函数。但是运行该函数将无休止地调用其自身,这当然是不正确的。为了防止递...

weixin_29698063的博客 282

算法设计与分析-算法分析

算法设计与分析-算法分析

z19903763213的博客 1045
上一篇: dijkstra算法详解
下一篇: 单源最短路算法汇总、分析、整理、实现与简单变形(C++ 语言描述)
Aobing_peterJr
博客等级 码龄2年 128粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值