题解 | #24点游戏算法#

24点游戏算法

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

#有点暴力枚举的意思:整体想法就是每次选择两个数!对!两个!(非常重要!) 把这两个数的计算结果 和之前nums数组中其他元素组成的列表concate起来作为新的nums 向下递归

def jP24(nums):
    if len(nums)==1:
        return abs(24-nums[0])<=10**(-10)
    # 每次把计算结果 和之前nums数组中其他元素组成的列表concate起来 作为新的nums 向下递归
    for i in range(len(nums)-1):
        for j in range(i+1,len(nums)):
            #加
            if jP24([nums[i]+nums[j]]+nums[0:i]+nums[i+1:j]+nums[j+1:]):
                return True
            #乘
            if jP24([nums[i]*nums[j]]+nums[0:i]+nums[i+1:j]+nums[j+1:]):
                return True
            #减(有顺序)
            if jP24([nums[i]-nums[j]]+nums[0:i]+nums[i+1:j]+nums[j+1:]):
                return True
            if jP24([nums[j]-nums[i]]+nums[0:i]+nums[i+1:j]+nums[j+1:]):
                return True
            #除(有顺序,且分母不等于0)
            if nums[j]!=0 and jP24([nums[i]/nums[j]]+nums[0:i]+nums[i+1:j]+nums[j+1:]):
                return True
            if nums[i]!=0 and jP24([nums[j]/nums[i]]+nums[0:i]+nums[i+1:j]+nums[j+1:]):
                return True
    #走到这一步 说明之前都不行! 
    # REMARK! return 相当于=break+print()!
    return False

while 1:
    try:
        s=input().split()
        nums=[int(i) for i in s]
        print(str(jP24(nums)).lower())
    except:
        break
'''
#下面的做法是错误的:比如3+9+3*4=24
def func(nums,target_num):
    if len(nums)==1:
        return nums[0]==target_num
    elif func(nums[0:len(nums)-1],target_num-nums[-1]):
        return True
    elif func(nums[0:len(nums)-1],target_num+nums[-1]):
        return True
    elif func(nums[0:len(nums)-1],target_num/nums[-1]):
        return True
    elif func(nums[0:len(nums)-1],target_num*nums[-1]):
        return True
    else:
        return False

while 1:
    try:
        s=input().split()
        nums=[int(i) for i in s]
        print(str(func(nums,24)).lower())
    except:
        break
'''
全部评论

相关推荐

1 2 评论
分享
牛客网
牛客企业服务