题解 | #24点运算#
24点运算
https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d
import random # 加强:随机抽取 def turn_num(lst): # 返回数值列表;处理J Q K A JOKER joker for i in lst: if "joker" in lst or "JOKER" in lst: return [] else: dict01 = {"J": 11, "Q": 12, "K": 13, "A": 1} lst01 = [dict01[i] if i in dict01 else int(i) for i in lst] # 全部int return lst01 def cal(lst, tar, res): """ 动态规划求表达式 :param lst: 没用过的数字列表 :param tar: 目标答案 :param res: 表达式 :return: """ dict01 = {"J": 11, "Q": 12, "K": 13, "A": 1} if len(lst) == 1 and tar == lst[0]: rlst.append(str(lst[0]) + res) else: for i in range(len(lst)): lst01 = lst[:i] + lst[i + 1 : :] cal(lst01, tar - lst[i], "+" + str(lst[i]) + res) cal(lst01, tar + lst[i], "-" + str(lst[i]) + res) cal(lst01, tar * lst[i], "/" + str(lst[i]) + res) cal(lst01, tar / lst[i], "*" + str(lst[i]) + res) def tran(s): s = s.replace("11", "J", 4) s = s.replace("12", "Q", 4) s = s.replace("13", "K", 4) s = s.replace("1", "A", 4) return s if __name__ == "__main__": while 1: rlst = [] # 记录结果的同时不影响迭代 try: lst = input().split() # 4张牌 lst01 = turn_num(lst) # 整理成数字 if not lst01: # 有大小joker报错 print("ERROR") break cal(lst01, 24, "") if not rlst: print("NONE") else: r1 = random.randrange(len(rlst)) r = tran(rlst[r1]) print(r) # 有多组答案的时候随机出现一个 except: break