Pyth, 30 29 bytes
L?bsmy-tb]dfq1.a-VThbb1y*FUMQ
Pruébelo en línea: Demonstration / Test Suite
Todas las entradas de ejemplo se ejecutan en el compilador en línea. Sin embargo, el último tarda unos segundos.
Explicación:
En mi código definiré una función recursiva y
. La función y
toma una lista de coordenadas 2D y devuelve el número de diferentes inclinaciones de dominó utilizando estas coordenadas. Por ejemplo y([[0,0], [0,1]]) = 1
(un dominó horizontal), y([[0,0], [1,1]]) = 0
(las coordenadas no son adyacentes) y y([[0,0], [0,1], [1,0], [1,1]]) = 2
(dos dominós horizontales o dos verticales). Después de definir la función, la llamaré con todas las coordenadas [x,y]
con x in [0, 1, m-1], y in [0, 1, n-1]
.
¿Cómo funciona la función recursiva? Es bastante simple. Si la lista de coordenadas está vacía, hay exactamente un mosaico válido y y
retornos 1
.
De lo contrario, tomo la primera coordenada de la lista b[0]
y busco las coordenadas restantes para un vecino. Si no hay ningún vecino b[0]
, entonces no es posible el mosaico, por lo tanto, devuelvo 0. Si hay uno o más vecinos, entonces el número de inclinaciones es (el número de inclinaciones donde me conecto b[0]
con el primer vecino a través de una domina, más el número de inclinaciones donde me conecto b[0]
con el segundo vecino, más ...) Entonces llamo a la función de forma recursiva para cada vecino con la lista acortada (eliminando las dos coordenadas b[0]
y el vecino). Después, resumo todos los resultados y los devuelvo.
Debido al orden de los cables, siempre hay dos vecinos posibles, el del lado derecho y el de abajo. Pero mi algoritmo no se preocupa por eso.
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