不久前,我编写了一个简单的 python 程序来暴力破解驱动 ya 坚果难题的单一解决方案。
(来源:tabbykat.com)
拼图由 7 个六边形组成,上面有数字 1-6,所有棋子必须对齐,以便每个数字与下一个棋子上的相同数字相邻。
该拼图具有~1.4G
非独特的可能性:您可以7!
选择按顺序对碎片进行排序(例如,center=0
,top=1
,按顺时针顺序继续...)。对碎片进行排序后,您可以以 6 种方式旋转每个碎片(每个碎片都是六边形),因此6**7
对于 7 个碎片的给定排列,您可以获得可能的旋转。总计:7!*(6**7)=~1.4G
可能性。以下 python 代码生成这些可能的解决方案:
def rotations(p):
for i in range(len(p)):
yield p[i:] + p[:i]
def permutations(l):
if len(l)<=1:
yield l
else:
for perm in permutations(l[1:]):
for i in range(len(perm)+1):
yield perm[:i] + l[0:1] + perm[i:]
def constructs(l):
for p in permutations(l):
for c in product(*(rotations(x) for x in p)):
yield c
但是,请注意,该拼图只有~0.2G
唯一的可能解决方案,因为您必须将可能性总数除以 6,因为每个可能的解决方案相当于 5 个其他解决方案(只需将整个拼图旋转 1/6 圈)。
有没有更好的方法来只为这个谜题生成独特的可能性?