日本每月的 22 日是水果酥饼日。因为看日历的时候,22 日的上方刚好是 15 日,也就是“‘22’ 这个数字上面点缀着草莓”[1]
切分酥饼的时候,要求切分后每一块上面的草莓个数都不相同。假设切分出来的 N 块酥饼上要各有“1~N 个(共 N(N + 1)÷2 个草莓)”。
但这里要追加一个条件,那就是“一定要使相邻的两块酥饼上的数字之和是平方数”。
举个例子,假设 N = 4 时采用如 图 4 的切法。这时,虽然 1 + 3 = 4 得到的是平方数,但“1 和 4” “2 和 3” “2 和 4”的部分都不满足条件。下图为不满足条件的切割。
思路:首先打好平方数表,用dfs搜索即可,遇到不满足的就返回,是典型的回溯搜索问题,代码如下:
def fruitcake(N):
# 打平方表
sqr_table = set()
for i in range(1, N):
sqr_table.add(i*i)
if i*i > N*2: break
# 搜索
l = [1]
def dfs():
if len(l) == N and l[-1]+l[0] in sqr_table:
return 1
for i in range(2, N+1):
if i not in l and l[-1]+i in sqr_table:
l.append(i)
if dfs(): return 1
l.pop()
return dfs()
for i in range(20, 65):
if fruitcake(i):
print(i)