“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

解决2020R2,2022R1等版本的SCDM无法编辑草图尺寸的问题

解决2020R2,2022R1等版本的SCDM无法编辑草图尺寸的问题

y_u_yu_yu_的博客 1万+

ubuntu恢复分区表——testdisk

testdisk恢复ubuntu分区表testdisk介绍安装testdisk使用testdisk恢复分区表 testdisk介绍 testdisk 具有广泛的功能,包括恢复丢失或损坏的分区和使不能启动磁盘可以重新启动,也经常被用来恢复被误删的文件。 安装testdisk 如果系统分区表被删除,需要使用ubuntu的启动盘,选择try ubnutu模式进入试用系统。 1、可以直接在终端安装testdisk: sudo apt-get install testdisk 通过命令直接打开testdisk: t

ZNestor的博客 6459

C++程序计算24点

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

gxgdcyy的博客 3846

风力摆控制系统 PCB 设计 3 要点:STM32+MPU6050+空心杯电机驱动一体化

本文详细解析了风力摆控制系统PCB设计的3大核心要点,重点介绍STM32主控、MPU6050姿态传感器与空心杯电机驱动的一体化方案。通过系统架构设计、PCB布局布线技巧以及噪声抑制方案,帮助参赛者在电子设计竞赛中构建高精度、高稳定性的风力摆控制系统,提升竞赛作品性能。

weixin_30363285的博客 361

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

用Omniverse Kit开发第一个USD插件:从环境配置到实战案例(Python 3.7版)

本文详细介绍了如何使用NVIDIA Omniverse Kit和Python 3.7开发第一个USD插件,涵盖从环境配置到实战案例的全过程。通过创建可实时同步材质属性的USD插件,开发者可以快速掌握Omniverse开发框架,提升3D内容创作效率。

x8y9z0的博客 588

STM32H743IIT6上LVGL移植实战:从零到触摸屏驱动的完整配置流程

本文详细记录了在STM32H743IIT6高性能MCU上,从零开始移植LVGL图形库到7寸RGB触摸屏的完整实战流程。内容涵盖工程搭建、显示与触摸驱动配置、LVGL核心优化及常见问题排查,重点讲解了如何利用STM32H743的硬件特性(如DMA2D、LTDC)提升GUI性能,为嵌入式GUI开发提供了一份详实的配置指南。

spark7igniter的博客 557

24点游戏

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

qq_54275216的博客 806

Windows本地部署Qwen3-14B实战指南:Ollama+Open WebUI零Docker方案

大语言模型本地部署是AI工程化落地的关键环节,其核心在于推理框架兼容性、硬件加速适配性与端到端稳定性。Ollama作为轻量级模型运行时,原生支持Windows DirectML与CUDA,规避了Docker/WSL2虚拟化开销和llama.cpp编译风险;Qwen3-14B则凭借128K上下文、Tool Calling原生支持及中文长文本结构化能力,成为政务、金融等场景首选。本文聚焦Windows平台真实约束——显存阈值、驱动版本匹配、路径编码兼容、离线知识库集成(RAG)等工程细节,提供经63台Windo

weixin_32136203的博客 413

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

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

mql6767521的博客 2464

Sigrity System Explorer Transient Analysis模式进行瞬态仿真分析操作指导-单端信号-串联端接

Sigrity System Explorer Transient Analysis模式可以用于瞬态仿真分析,通过搭建简易拓扑用于前仿真分析通道的时域性能,下面搭建一个简易的单端拓扑并且进行串联端接,以下图为例,准备好发送接收端的IBIS模型, (se_example.ibs,本例发送接收端都使用相同的IBIS模型),以及传输线的S参数模型(W1_welement_se.sp)最上方的图形界面是传输线的模型,本例是一个上下都有参考平面的带状线,右侧的梯形是蚀刻角度,根据W1和W2以及铜厚来确定。

weixin_54787054的博客 339

Python 爬虫教程:企业官网基本信息抓取

本文介绍了使用Python爬虫技术抓取企业官网信息的方法,包括公司名称、简介、联系方式、地址、产品及新闻等数据。通过Requests和BeautifulSoup库实现网页请求与解析,并利用Pandas存储数据为CSV文件。同时提供了应对反爬虫机制(如设置User-Agent、代理IP池、延迟请求等)的解决方案,帮助高效获取企业公开数据。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1861

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

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++语言的重要性

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

国旭 的专栏 3798

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

程序设计 288

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

数据结构精品电子书分享之《数据结构与算法分析–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、付费专栏及课程。

余额充值