Pyth, 30 29 Bytes
L?bsmy-tb]dfq1.a-VThbb1y*FUMQ
Probieren Sie es online aus: Demonstration / Test Suite
Alle Beispieleingaben werden im Online-Compiler ausgeführt. Der letzte dauert allerdings einige Sekunden.
Erläuterung:
In meinem Code werde ich eine rekursive Funktion definieren y
. Die Funktion y
nimmt eine Liste von 2D-Koordinaten und gibt anhand dieser Koordinaten die Anzahl der verschiedenen Domino-Kacheln zurück. ZB y([[0,0], [0,1]]) = 1
(ein horizontaler Domino), y([[0,0], [1,1]]) = 0
(Koordinaten sind nicht benachbart) und y([[0,0], [0,1], [1,0], [1,1]]) = 2
(entweder zwei horizontale oder zwei vertikale Dominosteine). Nachdem ich die Funktion definiert habe, rufe ich sie mit allen Koordinaten [x,y]
auf x in [0, 1, m-1], y in [0, 1, n-1]
.
Wie funktioniert die rekursive Funktion? Es ist ganz einfach. Wenn die Liste der Koordinaten leer ist, gibt es genau eine gültige Kachelung und y
kehrt zurück 1
.
Ansonsten nehme ich die erste Koordinate in der Liste b[0]
und suche die verbleibenden Koordinaten nach einem Nachbarn. Wenn es keinen Nachbarn b[0]
gibt, ist keine Kachelung möglich, daher gebe ich 0 zurück. Wenn es einen oder mehrere Nachbarn gibt, ist die Anzahl der Kacheln (die Anzahl der Kacheln, bei denen ich mich b[0]
über eine Domina mit dem ersten Nachbarn verbinde, plus die Anzahl der Kacheln, bei denen ich mich b[0]
mit dem zweiten Nachbarn verbinde, plus ...) Also rufe ich die Funktion rekursiv für jeden Nachbarn mit der verkürzten Liste auf (indem ich die beiden Koordinaten b[0]
und den Nachbarn entferne ). Danach fasse ich alle Ergebnisse zusammen und gebe sie zurück.
Aufgrund der Reihenfolge der Koordinaten sind immer nur zwei Nachbarn möglich, der rechte und der untere. Aber mein Algorithmus kümmert sich nicht darum.
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