首页 > 试题广场 >

24点运算

[编程题]24点运算
  • 热度指数:87714 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

计算24点是一种扑克牌益智游戏,随机抽出4张扑克牌,通过加(+),减(-),乘(*), (/)四种运算法则计算得到整数24,本问题中,扑克牌通过如下字符或者字符串表示,其中,小写joker表示小王,大写JOKER表示大王:

3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER

本程序要求实现:输入4张牌,输出一个算式,算式的结果为24点。

详细说明:

1.运算只考虑加减乘除运算,没有阶乘等特殊运算符号,没有括号,友情提醒,整数除法要当心,是属于整除,比如2/3=0,3/2=1
2.牌面2~10对应的权值为2~10, JQKA权值分别为为1112131
3.输入4张牌为字符串形式,以一个空格隔开,首尾无空格;如果输入的4张牌中包含大小王,则输出字符串“ERROR”,表示无法运算;
4.输出的算式格式为4张牌通过+-*/四个运算符相连,中间无空格4张牌出现顺序任意,只要结果正确;
5.输出算式的运算顺序从左至右,不包含括号,如1+2+3*4的结果为24,2 A 9 A不能变为(2+1)*(9-1)=24
6.如果存在多种算式都能计算得出24,只需输出一种即可,如果无法得出24,则输出“NONE”表示无解。
7.因为都是扑克牌,不存在单个牌为0的情况,且没有括号运算,除数(即分母)的数字不可能为0

数据范围:一行由4张牌组成的字符串

输入描述:

输入4张牌为字符串形式,以一个空格隔开,首尾无空格;



输出描述:
输出怎么运算得到24,如果无法得出24,则输出“NONE”表示无解,如果输入的4张牌中包含大小王,则输出字符串“ERROR”,表示无法运算;
示例1

输入

A A A A

输出

NONE

说明

不能实现           
示例2

输入

4 2 K A

输出

K-A*4/2

说明

 A+K*2-4也是一种答案,输出任意一种即可           
示例3

输入

B 5 joker 4

输出

ERROR

说明

 存在joker,输出ERROR          
示例4

输入

K Q 6 K

输出

NONE

说明

按一般的计算规则来看,K+K-(Q/6)=24 或 K-((Q/6)-K)=24,但是因为这个题目的运算不许有括号,所以去掉括号后变为 K+K-Q/6=26-Q/6=14/6=2 或 K-Q/6-K=1/6-K=0-K=-13,其它情况也不能运算出24点,故不存在,输出NONE   
头像 linjiexin
发表于 2020-03-08 02:57:13
思路: 由于四则运算组合的可能性很多,而且不存在子问题模板化适配,所以 递归、分治、动态规划的方式不行,不要遇见难一点的题就条件反射到这些方法上。 本题是必须穷举的,也就是暴力法。 我们先评估下暴力求解时的问题规模:4个数字,3个运算符。由于不允许带括号,而且数字先后顺序不固定,所 展开全文
头像 半梦未醒
发表于 2021-04-14 11:10:26
from itertools import permutations card = ['A','2','3','4','5','6','7','8','9','10','J','Q','K'] order = range(1,14) card_order = dict(zip(card,order 展开全文
头像 牛客44738297号
发表于 2021-02-22 10:47:34
d = {'3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, '10':10, 'J':11, 'Q':12, 'K':13, 'A':1, '2':2} def f(nums, target): if len(nums) == 1: 展开全文
头像 牛客596445797号
发表于 2022-06-13 11:05:05
类似"24点游戏算法"的原理,使用DFS搜索所有的可能组合,一旦找到符合要求的一种解就返回值,如果搜索不到就说明无符合要求的组合, 返回false. import java.util.*; public class Main {   &n 展开全文
头像 我心态贼好
发表于 2020-07-25 13:57:17
Java + DFS 类似于2-SUM 转化 3-SUM的思路: import java.util.Scanner; import java.util.LinkedList; import java.util.HashMap; public class Main{ public static 展开全文
头像 摸鱼学大师
发表于 2021-11-05 15:26:47
题目的主要信息: 给出四张扑克牌的牌面,将其当成数字,询问能否通过加减乘除得到24,除法是整除,给出算术式 牌面2到10分别对应数字2到10,然后J、Q、K、A分别代表11、12、13、1 遇到大小王joker、JOKER要输出ERROR 运算中数字的顺序不定,但是不能包含括号 如有多个解输出一个 展开全文
头像 霏坂
发表于 2022-07-23 22:17:02
题目明确表示了从前往后依次运算,所以其实从后往前看,始终是(ABC)+/-/*//D的形式,所以dfs采用倒序遍历的方式,最末尾的数直接影响前面几个数应该的输出值,直接倒序打印遍历,即可找到对应的计算流程了 a = input().split(' ') dictor 展开全文
头像 人生苦短,但求成长
发表于 2022-02-22 10:29:15
import itertools def fun(a, b, c, d): card_dict = { '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 展开全文
头像 TheLightOfStars
发表于 2020-03-04 08:24:56
深搜dfs 测试用例有问题,24点会有多组解的可能,通过65%,还看不到测试用例,好坑,本地测试ac。 #include <iostream> #include<string> #include<string.h> #include <algorithm& 展开全文
头像 洋葱不是橘子
发表于 2022-04-25 23:47:17
一、主要思路 拒绝多个 for 循环,本题只有 4 张牌,但如果是 8、16、32、64、128、256、1024 张牌,难道还写 for 循环吗? 四张牌计算得 24,可以拆解为 3 张牌计算结果和第四章进行计算的 24。可以采用递归。 可以使用字典或列表的 index 来转换牌的面值和实际的大 展开全文