它与生成多胺不同,但它也是NP难题。 我给了大小为4、5、6的多米诺骨牌作为阵列。
'F':{'num':0b011110010,'width':3} #will be mutated to polymino as
((0,1,1),(1,1,0),(0,1,0)) #as printed
(0,1,1)
(1,1,0)
(0,1,0)
我有一个2D数组,它以至少一种用给定的polymino集将其完全平铺的方式而闻名。
问题是找到平铺数组的方法。
为了解决这个问题,我做了算法,
A1。反转给定筹码所有可能旋转的二进制并添加到字典中,
Solver.keyset[tupleall(reverse_binary(objs.rotate(rots).shape))] = [[objs.name, rots, (0,0)]]
A2。检查给定数组是否在字典中
A3a。将数组除以x,y轴求解,并求解较小的数组
A3b。从字典中添加具有解决方案的数组并对其进行求解
它对于小型阵列非常有效,
a = Solver(((0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)))
a.chips(5,6) #chip sized for 5-6
a.solver()
a.info
[['6C', 3, (0, 0), '6D', 1, (0, 1)], ['6C', 1, (0, 1), '6D', 3, (0, 0)], ['6A', 2, (0, 0), '6A', 0, (1, 0)], ['6A', 3, (1, 0), '6A', 1, (0, 0)], ['6A', 0, (1, 0), '6A', 2, (0, 0)], ['6A', 1, (0, 0), '6A', 3, (1, 0)], ['6D', 3, (0, 0), '6C', 1, (0, 1)], ['6D', 1, (0, 1), '6C', 3, (0, 0)]]
(好吧,我需要剔除一些通过旋转重复的多胺)
但是对于较大的阵列,它会花费大量时间。
1-我的算法值得这么做吗? -我有其他算法可以更好地解决它吗?我尝试了蛮力,添加了所有可能的方法,但是花了太多时间,所以我仍然没有得到(8,6)数组的答案。
2-每个部门只允许一个答案会有所帮助吗? -它会大大加快找到答案的速度,但是它的多样性会减少。