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