一次意外的趣味算法问题
深夜时分,收到朋友来信,说是有一道趣味算法问题,希望可以在实现后交流一下心得。唔,其实我是很抵制大半夜还做这种不利于自己头发的事的,不过最终还是没能避免熬夜的命运……
问题
问题大概是这样的,有如下图所示这样一个六角星,同时现在有1-12这样几个数字,要求将这12个数字分别不重复地放在这个六角星所有线条的交点上,并且使每条线的和相等。
思路
既然是打算用计算机来解决问题,自然首先得考虑到计算机的优势——运算速度快,计算机可以通过穷举所有可能得出结果,12个数字不重复放到12个点上,首先得规定这些点在计算机中应该如何表示。
在这里我的想法是将外圈上的点和内圈的点分用两个数组表示,以外圈某一点为起点顺时针或逆时针将点依次放入数组1,再以同样的方式把内圈的点放入数组2。随后计算机生成1-12的6位全排列,遍历全排列把结果放入数组1作为外圈点上的数字,并且在每一次遍历后再以1-12里剩下的数生成全排列,作为数组2遍历的对象,如此便可以根据一条线上四个点和相等的条件确定结果。
实现
1 | import itertools |