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 ypega 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 yretornos 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