Schreiben Sie ein Programm oder eine Funktion , dass gegebene positive n und m die Anzahl der gültigen verschiedene Domino Pflasterungen berechnet Sie in einem passen n durch m Rechteck. Dies ist die Sequenz A099390 in der Online-Enzyklopädie der ganzzahligen Sequenzen . Sie können Eingaben als Funktionsargument (e), CLA oder auf stdin in einem beliebigen vernünftigen Format vornehmen. Sie müssen eine einzelne Ganzzahl als Ausgabe zurückgeben oder drucken.
Jede Kachelung darf keine Lücken hinterlassen, und jede einzelne Kachelung wird gezählt, einschließlich Rotationen, Reflexionen usw. Die Kacheln für 2x3 sind beispielsweise:
|-- ||| --|
|-- ||| --|
Beispiel Ein- / Ausgänge:
1, 9 -> 0
2, 2 -> 2
2, 3 -> 3
4, 4 -> 36
4, 6 -> 281
6, 6 -> 6728
7, 10 -> 53175517
Ihr Programm sollte theoretisch für jedes n und m funktionieren , aber wenn Ihr Programm zu viel Speicher benötigt oder Ihr Datentyp überläuft, wird es entschuldigt. Ihr Programm muss jedoch für jedes n, m <= 8 korrekt funktionieren .
Der kürzeste Code in Bytes gewinnt.
Antworten:
Pyth,
3029 BytesProbieren 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 Funktiony
nimmt eine Liste von 2D-Koordinaten und gibt anhand dieser Koordinaten die Anzahl der verschiedenen Domino-Kacheln zurück. ZBy([[0,0], [0,1]]) = 1
(ein horizontaler Domino),y([[0,0], [1,1]]) = 0
(Koordinaten sind nicht benachbart) undy([[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]
aufx 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ück1
.Ansonsten nehme ich die erste Koordinate in der Liste
b[0]
und suche die verbleibenden Koordinaten nach einem Nachbarn. Wenn es keinen Nachbarnb[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 michb[0]
über eine Domina mit dem ersten Nachbarn verbinde, plus die Anzahl der Kacheln, bei denen ich michb[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 Koordinatenb[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.
quelle
Matlab, 292
Ich bin sicher, dass dies sehr verkürzt werden kann, wenn man es einfach in eine andere Sprache portiert.
Die Grundidee ist Bruteforcing: Ich habe mir eine Art Aufzählung aller Möglichkeiten ausgedacht, wie man
m*n/2
Dominosteine auf einm*n
Brett legt . Diese Aufzählung enthält jedoch auch viele ungültige Kacheln (Steine, die sich überlappen oder außerhalb der Tafel liegen). Das Programm erstellt also alle diese Kacheln und zählt nur die gültigen. Die Laufzeitkomplexität ist ungefährO(2^(m*n/2) * m*n)
. Speicher ist kein Problem für die,8x8
da er nurO(m*n)
Speicher benötigt . Die dafür benötigte Zeit8x8
beträgt jedoch etwa 20 Tage.Hier die vollständig kommentierte Version, die erklärt, was los ist.
PS: Wenn jemand weiß, wie die Hervorhebung der Matlab-Syntax funktioniert, fügen Sie bitte das entsprechende Tag in diese Antwort ein!
Hier der voll Golf:
quelle
C89, 230 Bytes
Zur besseren Lesbarkeit habe ich diese Antwort handverpackt - alle Zeilenumbrüche können sicher entfernt werden, um 230 Byte zu erreichen.
Definiert eine Funktion
int g(int n, int m)
, die die Anzahl der Kacheln zurückgibt. Es verwendet einef
Hilfsfunktion, die alle gültigen Kacheln durchläuft, indem ein Domino platziert, rekursiv und dann auf einer gemeinsam genutzten Karte entfernt wird.quelle
Python 243
Ich habe mich für einen Brute-Force-Ansatz entschieden:
Wenn sie alle passen und keine Leerzeichen mehr vorhanden sind, haben wir einen gültigen Eintrag.
Hier ist der Code:
quelle