题解 | #24点游戏算法#
24点游戏算法
https://www.nowcoder.com/practice/fbc417f314f745b1978fc751a54ac8cb
import sys ''' 核心思想:找出四个数的全排列,在排列间隙插入运算符 注意:按照顺序的方式插入运算符计算,可以涵盖除类似(a+b)*(c+d)之外的所有加括号方式;该种方式单独处理 原本想的是直接全排列四个运算符和四个操作数,使用eval(),但这种方法不能实现,这种方法也不能实现(a+b)*(c+d)的加括号方式,而且对于用例 1,2,4,6 4*6=24,即只用选2个或3个数,就需要对每一种排列做三种不同情况的判断 ''' # 获取所有数字的排列组合 def allSort(position): if position == l: allS.append(tmp.copy()) return else: for i in range(l): if not visited[i]: tmp[position] = waitSortL[i] visited[i] = True allSort(position+1) visited[i] = False # 计算两个数的加减乘除 def ope(a,b): l = [] l.append(a+b) l.append(a*b) l.append(a-b) if b != 0: l.append(a/b) return l # 处理每种数字组合 def fun1(nums): l1 = ope(nums[0], nums[1]) if 24 in l1: return True l2 = [] for i in l1: l2 = ope(i, nums[2]) if 24 in l2: return True for i in l2: l3 = ope(i, nums[3]) if 24 in l3: return True # 前三种没法处理类似(a+b)*(c+d)的情况 l4 = ope(nums[2], nums[3]) for i in l1: for j in l4: l5 = ope(i, j) if 24 in l5: return True return False for line in sys.stdin: a = list(map(int,line.split())) l = 4 allS = [] tmp = [0]*l visited = [False]*l waitSortL = a allSort(0) numS = allS.copy() flag = 0 for i in numS: if fun1(i): print('true') flag = 1 break if not flag: print('false')