Pyth,30个 29字节
L?bsmy-tb]dfq1.a-VThbb1y*FUMQ
在线试用:演示 / 测试套件
所有示例输入均在联机编译器中运行。最后一个需要几秒钟。
说明:
在我的代码中,我将定义一个递归函数y
。该函数y
获取2D坐标的列表,并使用这些坐标返回不同的多米诺瓷砖的数量。例如y([[0,0], [0,1]]) = 1
(一个水平多米诺骨牌),y([[0,0], [1,1]]) = 0
(坐标不相邻)和y([[0,0], [0,1], [1,0], [1,1]]) = 2
(两个水平或两个垂直多米诺骨牌)。定义功能后,我会与所有的坐标调用它[x,y]
用x in [0, 1, m-1], y in [0, 1, n-1]
。
递归函数如何工作?这很简单。如果坐标列表为空,则只有一个有效的平铺并y
返回1
。
否则,我将获取列表中的第一个坐标b[0]
,并在其余的坐标中搜索邻居。如果没有邻居b[0]
,则不可能进行切片,因此我返回0。如果存在一个或多个邻居,则切片数为(通过多米纳b[0]
与第一个邻居连接的切片数,加上我b[0]
与第二个邻居连接的平铺数,加上...)因此,我以缩短的列表为每个邻居递归调用该函数(通过删除两个坐标b[0]
和邻居)。然后,我总结所有结果并将其返回。
由于坐标的顺序,总是只有两个邻居,一个在右边,另一个在下面。但是我的算法不在乎。
UMQ convert the input numbers into ranges
*F Cartesian product (coords of each square)
L define a function y(b):
?b if len(b) > 0:
f b filter b for squares T, which satisfy:
.a-VThb Euclidean distance between T and b[0]
q1 is equal to 1 (direct neighbors)
m map each neighbor d to:
-tb]d remove d from b[1]
y and call recursively y with the rest
s sum all those values and return them
else:
1 return 1 (valid domino tiling found)
y*FUMQ Call y with all coords and print the result