题解 | #24点运算#
24点运算
https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d
'''思路: 1. 获取四张数字牌的全排列 2. 对每一种全排列计算遍历所有可能的表达式 Tip:可以根据24在所有表达式遍历结果list中的index判断每一步都做了什么运算,从而不用在计算中保留计算方式 ''' l = 4 visited = [False]*l s = [0]*l allS = [] flag = 0 # dfs全排列 def allSort(pos): # i:元素为int的list if pos == l: allS.append(s.copy()) return else: for i in range(l): if not visited[i]: visited[i] = True s[pos] = li[i] # !不pop,只修改 allSort(pos+1) visited[i] = False # 处理输入 inp = input().split() d = { 'J': 11, 'Q': 12, 'K': 13, "A": 1, } d_ = { 11: 'J', 12: 'Q', 13: 'K', 1: 'A' } if 'joker' in inp: print('ERROR') exit() for i in range(4): if inp[i] in d: inp[i] = d[inp[i]] li = list(map(int, inp)) allSort(0) def ope(a, b): # print(a,b) tmp = [] tmp.append(a+b) tmp.append(a-b) tmp.append(a*b) tmp.append(a//b) return tmp # 根据24的下标求表达式,ope_n表示第n次运算 def getExp(ind, nums): ope3 = ind%4 ope2 = ind//4%4 ope1 = ind//16 opes = ['+', '-', '*', '/'] for i in range(4): if nums[i] in d_: nums[i] = d_[nums[i]] return str(nums[0])+opes[ope1]+str(nums[1])+opes[ope2]+str(nums[2])+opes[ope3]+str(nums[3]) for nums in allS: l1 = ope(nums[0], nums[1]) l2 = [] for i in l1: l2.extend(ope(i, nums[2])) l3 = [] for i in l2: l3.extend(ope(i, nums[3])) try: ind = l3.index(24) print(getExp(ind, nums)) flag = 1 break except: continue if not flag: print('NONE')