1.题目简述
计算 24 点是一种扑克牌益智游戏,随机抽出 4 张扑克牌,通过加 (+) ,减 (-) ,乘 ( * ), 除 (/) 四种运算法则计算得到整数 24 ,本问题中,扑克牌通过如下字符或者字符串表示,其中,小写 joker 表示小王,大写 JOKER 表示大王:
3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
本程序要求实现:输入 4 张牌,输出一个算式,算式的结果为 24 点。
详细说明:
(1)运算只考虑加减乘除运算,没有阶乘等特殊运算符号, 友情提醒,整数除法要当心 ;
(2)牌面 2~10 对应的权值为 2~10, J 、 Q 、 K 、 A 权值分别为为 11 、 12 、 13 、 1 ;
(3)输入 4 张牌为字符串形式,以 一个空格 隔开,首尾无空格;如果输入的 4 张牌中包含大小王,则输出字符串“ ERROR ”,表示无法运算;
(4) 输出的算式格式为 4 张牌通过 +-*/ 四个运算符相连, 中间无空格 , 4 张牌出现顺序任意,只要结果正确;
(5)输出算式的运算顺序从左至右,不包含括号 ,如 1+2+3*4 的结果为 24
(6) 如果存在多种算式都能计算得出 24 ,只需输出一种即可,如果无法得出 24 ,则输出“ NONE ”表示无解。
2. 示例
(1) 4 2 K A
K-A*4/2
(2)A A A A
NONE
3. 代码
import itertools
while True:
try:
in_ = input()
op=["+","-","*","/"]
if ("Joker" in in_) or ("JOKER" in in_):
print("ERROR")
break
list_in = in_.split()
list_trans = []
#转换JQKA
for i in list_in:
if i=="J":
list_trans.append("11")
elif i=="Q":
list_trans.append("12")
elif i=="K":
list_trans.append("13")
elif i=="A":
list_trans.append("1")
else:
list_trans.append(i)
#遍历所有符号和数字组合
def cal(d1,d2,d3,d4,op1,op2,op3):
sum = 0
if op1==0:
sum = d1+d2
elif op1==1:
sum = d1-d2
elif op1==2:
sum = d1*d2
elif op1==3:
if d1%d2==0:
sum = d1//d2
else:
return 0
if op2==0:
sum += d3
elif op2==1:
sum -= d3
elif op2==2:
sum *= d3
elif op2==3:
if sum%d3==0:
sum = sum//d3
else:
return 0
if op3==0:
sum += d4
elif op3==1:
sum -= d4
elif op3==2:
sum *= d4
elif op3==3:
if sum%d4==0:
sum = sum//d4
else:
return 0
return sum
result = ""
endTarg = False
#第一个for实现四张牌的全排列
#后面三个for实现运算符的所有组合
for order_ in itertools.permutations("0123",4):
for i in range(4):
for j in range(4):
for k in range(4):
if(cal(int(list_trans[int(order_[0])]),int(list_trans[int(order_[1])]),int(list_trans[int(order_[2])]),int(list_trans[int(order_[3])]),i,j,k)==24):
result = list_trans[int(order_[0])]+op[i]+list_trans[int(order_[1])]+op[j]+list_trans[int(order_[2])]+op[k]+list_trans[int(order_[3])]
#已经生成最终结果,在改回扑克牌的形式
if("11" in result):
result = result.replace("11","J")
if "12" in result:
result = result.replace("12","Q")
if "13" in result:
result = result.replace("13","K")
if "1" in result:
result = result.replace("1","A")
endTarg = True
if endTarg==True:
break
if endTarg==True:
break
if endTarg==True:
break
if endTarg==True:
break
if endTarg==False:
print("NONE",end="")
else:
print(result)
except:
break