题解 | #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')

#刷题#
全部评论

相关推荐

06-28 22:48
已编辑
广东金融学院 Java
小浪_Coding:学院本+这俩项目不是buff叠满了嘛
点赞 评论 收藏
分享
06-12 16:23
已编辑
小米_软件开发(准入职员工)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务