Pitão, 30 29 bytes
L?bsmy-tb]dfq1.a-VThbb1y*FUMQ
Experimente on-line: Demonstration / Test Suite
Todas as entradas de exemplo são executadas no compilador online. O último leva alguns segundos.
Explicação:
No meu código, definirei uma função recursiva y
. A função y
pega uma lista de coordenadas 2D e retorna o número de diferentes inclinação do dominó usando essas coordenadas. Por exemplo y([[0,0], [0,1]]) = 1
(um dominó horizontal), y([[0,0], [1,1]]) = 0
(as coordenadas não são adjacentes) e y([[0,0], [0,1], [1,0], [1,1]]) = 2
(dois dominós horizontais ou dois verticais). Depois de definir a função, chamarei com todas as coordenadas [x,y]
com x in [0, 1, m-1], y in [0, 1, n-1]
.
Como funciona a função recursiva? É bem simples Se a lista de cordas estiver vazia, haverá exatamente um lado a lado e y
retornos válidos 1
.
Caso contrário, pego a primeira coordenada da lista b[0]
e busco as demais coordenadas por vizinhos. Se não houver vizinho b[0]
, então não será possível colocar lado a lado, portanto, retornarei 0. Se houver um ou mais vizinhos, o número de inclinações será (o número de inclinações em que eu me conecto b[0]
com o primeiro vizinho através de uma domina, mais o número de inclinações em que eu me conecto b[0]
com o segundo vizinho, mais ...) Então chamo a função recursivamente para cada vizinho com a lista abreviada (removendo as duas cordas b[0]
e o vizinho). Depois, resumi todos os resultados e os devolvo.
Por causa da ordem dos cabos, sempre existem apenas dois vizinhos possíveis, o do lado direito e o abaixo. Mas meu algoritmo não se importa com isso.
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