import sys
arr = list(map(int, input().split()))
N = 4
visit = []
st = []
path = []
def dfs(l, res):
# if len(path)==4:
# if path[0][0] == 0 and path[1][0]==1 and path[2][0]==2 or path[3][0]==3:
# print(path)
if l==4 and (abs(res - 24) < 1e-4):
# print(path, res)
return True
# 特殊处理情况:剩下两个数乘除运算后于当前相加减,或者剩下两个数加减后于当前相乘除情况
if l==2:
num_remain = [arr[i] for i in range(N) if not visit[i]]
wait_res1 = [num_remain[0] * num_remain[1], num_remain[1] / num_remain[0], num_remain[0] / num_remain[1]]
wait_res2 = [num_remain[0] + num_remain[1], num_remain[0] - num_remain[1], num_remain[1] - num_remain[0]]
for w in wait_res1:
if abs(res + w - 24)<1E-5 or abs(res - w - 24)<1E-5 or abs(-res + w - 24)<1E-5:
return True
for w in wait_res2:
if abs(res * w - 24)<1E-5 or (w !=0 and abs(res / w - 24)<1E-5) or (res!=0 and abs(w/res - 24)<1E-5):
return True
# 此处循环未包含剩下两个数乘除运算后于当前相加减情况,或者剩下两个数加减后于当前相乘除情况
for i in range(N):
if not visit[i]:
visit[i] = True
path.append((i, res + arr[i]))
if dfs(l+1, res + arr[i]):
return True
path.pop()
path.append((i, res - arr[i]))
if dfs(l+1, res - arr[i]):
return True
path.pop()
path.append((i, arr[i] - res))
if dfs(l+1, arr[i] - res):
return True
path.pop()
path.append((i, res * arr[i]))
if dfs(l+1, res * arr[i]):
return True
path.pop()
if arr[i]!=0:
path.append((i, res / arr[i]))
if dfs(l+1, res / arr[i]):
return True
path.pop()
if res !=0:
path.append((i, arr[i] / res))
if dfs(l+1, arr[i] / res):
return True
path.pop()
visit[i] = False
return False
for i in range(N):
# 各个元素作为起始点
visit = [False for _ in range(N)]
path=[(i, arr[i])]
visit[i] = True
if dfs(1, arr[i]):
print("true")
exit(0)
print("false")
如果不在代码中交换已求和部分和剩余未求和部分的顺序,对于4个元素的情况,DFS会漏掉前两个和后两个元素各自计算的结果再次运算。因此我在代码中手动加入了这个特殊情形。看到有些代码样例将求和的结果和未运算的结果放在一起用于dfs下一步的数组,这种方法可以应对任意长度的数组,而不受限于4个元素的情况。

京公网安备 11010502036488号