题解 | #24点游戏算法# 枚举俩括号的5种顺序
24点游戏算法
https://www.nowcoder.com/practice/fbc417f314f745b1978fc751a54ac8cb
import itertools
def calculate24(nums):
operators = ['+', '-', '*', '/']
def operate(a, b, operator):
if a == None or b == None or (abs(b) < 1e-6 and operator == '/'):
return None
if operator == '+':
return a + b
elif operator == '-':
return a - b
elif operator == '*':
return a * b
elif operator == '/':
return a / b
def evaluate_expression(expr):
num, op = [], []
for item in expr:
if item in operators:
op.append(item)
elif item.isdigit():
num.append(int(item))
elif item == ')':
b = num.pop()
a = num.pop()
num.append(operate(a, b, op.pop()))
if len(num) > 1: # 不然就在下个函数定义内,把第3个右括号加到每个expr末尾
b = num.pop()
a = num.pop()
num.append(operate(a, b, op.pop()))
return num[0]
def generate_expressions_with_brackets(perm):
expressions = []
for op1 in operators:
for op2 in operators:
for op3 in operators:
expressions.append([perm[0], op1, '(', '(', perm[1], op2, perm[2], ')', op3, perm[3], ')']) # 2 3 1
expressions.append([perm[0], op1, '(', perm[1], op2, '(', perm[2], op3, perm[3], ')', ')']) # 3 2 1
expressions.append(['(', '(', perm[0], op1, perm[1], ')', op2, perm[2], ')', op3, perm[3]]) # 1 2 3
expressions.append(['(', perm[0], op1, '(', perm[1], op2, perm[2], ')', ')', op3, perm [3]]) # 2 1 3
expressions.append(['(', perm[0], op1, perm[1], ')', op2, '(', perm[2], op3, perm[3], ')']) # 1 3 2 = 3 1 2
return expressions
for perm in itertools.permutations(nums):
for expr in generate_expressions_with_brackets(perm):
result = evaluate_expression(expr)
if result is not None and abs(result - 24) < 1e-6:
return True
return False
if calculate24(input().split(' ')):
print('true')
else:
print('false')
#刷题#