深夜时分,收到朋友来信,说是有一道趣味算法问题,希望可以在实现后交流一下心得。唔,其实我是很抵制大半夜还做这种不利于自己头发的事的,不过最终还是没能避免熬夜的命运……

问题

问题大概是这样的,有如下图所示这样一个六角星,同时现在有1-12这样几个数字,要求将这12个数字分别不重复地放在这个六角星所有线条的交点上,并且使每条线的和相等。

思路

既然是打算用计算机来解决问题,自然首先得考虑到计算机的优势——运算速度快,计算机可以通过穷举所有可能得出结果,12个数字不重复放到12个点上,首先得规定这些点在计算机中应该如何表示。

在这里我的想法是将外圈上的点和内圈的点分用两个数组表示,以外圈某一点为起点顺时针或逆时针将点依次放入数组1,再以同样的方式把内圈的点放入数组2。随后计算机生成1-12的6位全排列,遍历全排列把结果放入数组1作为外圈点上的数字,并且在每一次遍历后再以1-12里剩下的数生成全排列,作为数组2遍历的对象,如此便可以根据一条线上四个点和相等的条件确定结果。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import itertools
list1 = [1,2,3,4,5,6,7,8,9,10,11,12]
iter1 = itertools.permutations(list1,6)
list2=list(iter1)
for i in list2:
l=list1[:]

for j in i:
l.remove(j)

iter2 = itertools.permutations(l,6)
in_nums=list(iter2)
for k in in_nums:
ac=i[0]+i[2]+k[1]+k[2]
ae=i[0]+i[4]+k[0]+k[5]
bf=i[1]+i[5]+k[0]+k[1]
bd=i[1]+i[3]+k[2]+k[3]
ce=i[2]+i[4]+k[3]+k[4]
df=i[3]+i[5]+k[4]+k[5]

if ac==ae==bf==bd==ce==df:
print('result:')
print(i+k)