题解 | 24点游戏算法

24点游戏算法

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

from itertools import permutations, product


def solve_24_game(nums):
    op = ["+", "-", "*", "/"]
    found = False

    # 遍历所有数字的排列
    for num_perm in permutations(nums):
        # 遍历所有运算符的组合
        for ops in product(op, repeat=3):
            try:
                # 情况 1: ((a op1 b) op2 c) op3 d
                expr1 = f"({num_perm[0]}{ops[0]}{num_perm[1]})"
                expr2 = f"({expr1}{ops[1]}{num_perm[2]})"
                expr3 = f"({expr2}{ops[2]}{num_perm[3]})"
                result = eval(expr3)
                if abs(result - 24.0) < 1e-6:
                    found = True
                    break

                # 情况 2: (a op1 (b op2 c)) op3 d
                expr1 = f"({num_perm[1]}{ops[1]}{num_perm[2]})"
                expr2 = f"({num_perm[0]}{ops[0]}{expr1})"
                expr3 = f"({expr2}{ops[2]}{num_perm[3]})"
                result = eval(expr3)
                if abs(result - 24.0) < 1e-6:
                    found = True
                    break

                # 情况 3: a op1 (b op2 (c op3 d))
                expr1 = f"({num_perm[2]}{ops[2]}{num_perm[3]})"
                expr2 = f"({num_perm[1]}{ops[1]}{expr1})"
                expr3 = f"({num_perm[0]}{ops[0]}{expr2})"
                result = eval(expr3)
                if abs(result - 24.0) < 1e-6:
                    found = True
                    break

                # 情况 4: (a op1 b) op2 (c op3 d)
                expr1 = f"({num_perm[0]}{ops[0]}{num_perm[1]})"
                expr2 = f"({num_perm[2]}{ops[2]}{num_perm[3]})"
                expr3 = f"({expr1}{ops[1]}{expr2})"
                result = eval(expr3)
                if abs(result - 24.0) < 1e-6:
                    found = True
                    break

                # 情况 5: a op1 ((b op2 c) op3 d)
                expr1 = f"({num_perm[1]}{ops[1]}{num_perm[2]})"
                expr2 = f"({expr1}{ops[2]}{num_perm[3]})"
                expr3 = f"({num_perm[0]}{ops[0]}{expr2})"
                result = eval(expr3)
                if abs(result - 24.0) < 1e-6:
                    found = True
                    break

                # 情况 6: ((a op1 b) op2 (c op3 d))
                expr1 = f"({num_perm[0]}{ops[0]}{num_perm[1]})"
                expr2 = f"({num_perm[2]}{ops[2]}{num_perm[3]})"
                expr3 = f"({expr1}{ops[1]}{expr2})"
                result = eval(expr3)
                if abs(result - 24.0) < 1e-6:
                    found = True
                    break

            except ZeroDivisionError:
                continue
        if found:
            break

    return found


# 输入四个数字
nums = list(map(int, input().split()))

# 调用函数并输出结果
if solve_24_game(nums):
    print("true")
else:
    print("false")

全部评论

相关推荐

留声唱片机:你没问问元宝让不让你入职腾讯?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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