## 1、描述

计算24点是一种扑克牌益智游戏，随机抽出4张扑克牌，通过加(+)，减(-)，乘(*), 除(/)四种运算法则计算得到整数24，

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

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

题目地址牛客网地址

## 2、解题思路

暴力法穷举所有的可能的组合（题目只需找到任意满足24点的式子即可）。

4 x 4 x 3 x 4 x 2 x 4 x 1= 256 x 6 = 1536 (每层需查找4种算符)

主要难点是7层循环内部的剪枝，即候选的数字的剪枝，内层的数字不要和外层重复

（抽出来的4张牌可能重复，即牌面的数值会重复，而牌不能重复-对应位置的牌在式子中只出现一次）

## 3、代码

pokers = input().split(" ")

pok_2_digit = {'J': 11, 'Q': 12, 'K': 13, 'A': 1}
digit_2_pok = {pok_2_digit[k]: k for k in pok_2_digit}

digits = []
flag = False
for pok in pokers:
if len(pok) != 5:
if pok.isdigit():
digits.append(int(pok))
else:
digits.append(pok_2_digit[pok])
else:
flag = True
break

if flag == True:
print('ERROR')
else:
def operate(nums, opers):
res = nums[0]
for i in range(len(opers)):
num = nums[i+1]
oper = opers[i]
if oper == '+':
res += num
elif oper == '-':
res -= num
elif oper == '*':
res *= num
elif oper == '/':
res = res // num
return res

def output(res_nums, res_opers):
nums = []
for num in res_nums:
if num in digit_2_pok:
nums.append(digit_2_pok[num])
else:
nums.append(str(num))

res = [nums[0]]
for i in range(len(res_opers)):
res.append(res_opers[i])
res.append(nums[i+1])
return "".join(res)

opers = ['+', '-', '*', '/']
def check_24(digits, opers):
n = len(digits)
for i1 in range(n):
d1 = digits[i1]
for o1 in opers:
for i2 in range(n):
if i2 != i1:
d2 = digits[i2]
for o2 in opers:
for i3 in range(n):
if i3 != i2 and i3 != i1:
d3 = digits[i3]
for o3 in opers:
for i4 in range(n):
if i4 != i3 and i4 != i2 and i4 != i1:
d4 = digits[i4]
enum_nums = (d1, d2, d3, d4)
enum_opers = (o1, o2, o3)
if operate(enum_nums, enum_opers) == 24:
return output(enum_nums, enum_opers)
return None

result = check_24(digits, opers)
if result:
print(result)
else:
print('NONE')