题解 | #24点游戏算法#

24点游戏算法

https://www.nowcoder.com/practice/fbc417f314f745b1978fc751a54ac8cb

解题思路:

1. 操作符与括号的选择:

需要考虑加、减、乘、除这四种基本运算符号。同时,由于运算的顺序不同,括号的使用也可能影响最终结果。因此,必须尝试各种组合和排列方式来进行计算。

2. 数字排列的组合:

给定的4个数字可以有不同的排列方式,总共有24种排列方式(4! = 24)。我们需要尝试这些不同的数字排列组合。

3. 运算符的选择:

在每一组排列的数字之间插入运算符,这意味着有3个位置可以选择运算符,因此运算符有4种(加减乘除),总共有4^3 = 64 种运算符的组合方式。

4. 括号的组合:

括号的加入会改变运算的顺序,因此需要考虑不同的括号位置。例如:((a op b) op c) op d 和 (a op (b op (c op d))) 都是不同的表达式形式。

import itertools

def cal(a, b, op):
    if op == '+':
        return a + b
    elif op == '-':
        return a - b
    elif op == '*':
        return a * b
    elif op == '/':
        if b == 0:  # 避免除以零
            return float('inf')
        return a / b

def evaluate_expression(nums):
    operators = ['+', '-', '*', '/']
    
    # 尝试所有数字排列组合
    for perm in itertools.permutations(nums):
        # 尝试所有操作符的排列组合
        for ops in itertools.product(operators, repeat=3):
            # 使用不同的括号组合计算
            try:
                # (a op1 b) op2 (c op3 d)
                if abs(cal(cal(perm[0], perm[1], ops[0]), cal(perm[2], perm[3], ops[2]), ops[1]) - 24) < 1e-6:
                    return True
                # ((a op1 b) op2 c) op3 d
                if abs(cal(cal(cal(perm[0], perm[1], ops[0]), perm[2], ops[1]), perm[3], ops[2]) - 24) < 1e-6:
                    return True
                # (a op1 (b op2 c)) op3 d
                if abs(cal(cal(perm[0], cal(perm[1], perm[2], ops[1]), ops[0]), perm[3], ops[2]) - 24) < 1e-6:
                    return True
                # a op1 ((b op2 c) op3 d)
                if abs(cal(perm[0], cal(cal(perm[1], perm[2], ops[1]), perm[3], ops[2]), ops[0]) - 24) < 1e-6:
                    return True
                # a op1 (b op2 (c op3 d))
                if abs(cal(perm[0], cal(perm[1], cal(perm[2], perm[3], ops[2]), ops[1]), ops[0]) - 24) < 1e-6:
                    return True
            except ZeroDivisionError:
                continue
    return False

# 输入与输出部分
def main():
    # 读入4个[1,10]的整数
    nums = list(map(int, input().split()))
    # 输出能否得到24点
    if evaluate_expression(nums):
        print("true")
    else:
        print("false")

if __name__ == "__main__":
    main()

全部评论

相关推荐

下北泽:都是校友,还是同届,我就说直白点,不委婉了,我相信你应该也不是个玻璃心,首先你觉得一个双非的绩点写简历上有用吗?班长职务有用吗?ccf有用吗?企业会关心你高数满分与否吗?第二,第一个项目实在太烂,一眼就能看出是外卖,还是毫无包装的外卖,使用JWT来鉴权,把热点数据放进Redis这两个点居然还能写进简历里,说难听点这两个东西都是学个几十分钟,调用个API就能完成的事情,在双非一本的条件下,这种项目你觉得能拿出手吗,第二个项目你写的东西和你的求职方向有任何的匹配吗?第三,计设那一块毫无价值,如果想突出自己会前端,直接写入专业技能不行吗,最后,专业技能里像深入理解JVM底层原理这种你觉得这句话你自己真的能匹配吗?都是校友加上同届,我措辞直接,但希望能点出你的问题,想进大厂还得继续沉淀项目和学习
点赞 评论 收藏
分享
03-30 19:30
石家庄学院 Java
野蛮的柯基在游泳:都能入股了,还得是Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务