题解 | #24点游戏算法#

24点游戏算法

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

# 问题分解成子问题,没有写成递归
import sys
def remove_ele(lst, i):
    # 先检查索引是否在列表范围内
    if 0 <= i < len(lst):
        # 使用列表切片来创建一个新列表
        return lst[:i] + lst[i+1:]
    else:
        # 如果索引超出范围,返回原始列表
        return lst

def calculate(nums):
    # 不带括号的四则运算的全部结果,列表,结果只保留自然数
    if len(nums) == 0:
        return [0]
    if len(nums) == 1:
        num = nums[0]
        return [num]
    nums = sorted(nums)
    if len(nums) == 2:
        n0 = nums[0]
        n1 = nums[1]
        ret = [n0+n1,n1-n0,n1*n0,]
        if n0 != 0 and n1%n0 == 0:
            ret.append(int(n1/n0))
        # if 24 in set(ret):
        #     print(n0,n1)
        return ret
    if len(nums) == 3:
        # 带括号 2 + 1
        res = []
        for i in range(3):
            ret = calculate(remove_ele(nums,i))
            for r in ret:
                res += calculate([nums[i],r])
        # 不带括号 1+1+1,其实可以看作是带括号的子集
        # pass
        return res
    if len(nums) == 4:
        # 3 + 1
        res = []
        for i in range(4):
            ret = calculate(remove_ele(nums,i))
            for r in ret:
                res += calculate([nums[i],r])
        # 2 + 1 + 1,相当于3 + 1
        # pass
        # 2+2
        for i in range(3):
            for j in range(i+1,4):
                ret1 = calculate(remove_ele(remove_ele(nums,j),i))
                ret2 = calculate((nums[i],nums[j]))
                for r1 in ret1:
                    for r2 in ret2:
                        res += calculate([r1,r2])
        # 不带括号,相当于2+1+1
        return res
    return []
nums = list(map(int,input().strip().split()))
res = calculate(nums)
res = set(res)
if 24 in res:
    print("true")
else:
    print("false")
# print(res)

全部评论

相关推荐

03-28 16:43
佛山大学 Java
java全国可飞:简历2.0,各位佬看看,这样可以吗查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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