Funktion , nicht wettbewerbsfähig
AKTUALISIEREN! Massive Leistungssteigerung! n = 7 ist jetzt in weniger als 10 Minuten erledigt! Siehe Erklärung unten!
Es hat Spaß gemacht, darüber zu schreiben. Dies ist ein Brute-Force-Löser für dieses in Funciton geschriebene Problem. Einige Factoids:
- Es akzeptiert eine Ganzzahl für STDIN. Beliebige Whitespaces unterbrechen den Text, einschließlich einer neuen Zeile nach der Ganzzahl.
- Es verwendet die Zahlen 0 bis n - 1 (nicht 1 bis n ).
- Es füllt das Raster „rückwärts“ aus, sodass Sie eine Lösung erhalten, bei der die untere Zeile
3 2 1 0
und nicht die obere Zeile gelesen wird 0 1 2 3
.
- Es gibt richtig
0
(die einzige Lösung) für n = 1 aus.
- Leere Ausgabe für n = 2 und n = 3.
- Wenn zu einer Exe kompiliert, dauert es ungefähr 8¼ Minuten für n = 7 (war ungefähr eine Stunde vor der Leistungsverbesserung). Ohne das Kompilieren (mit dem Interpreter) dauert es ungefähr 1,5-mal so lange, daher lohnt es sich, den Compiler zu verwenden.
- Als persönlicher Meilenstein habe ich zum ersten Mal ein ganzes Funciton-Programm geschrieben, ohne es zuvor in einer Pseudocodesprache geschrieben zu haben. Ich habe es allerdings zuerst in C # geschrieben.
- (Dies ist jedoch nicht das erste Mal, dass ich eine Änderung vorgenommen habe, um die Leistung von etwas in Funciton massiv zu verbessern. Das erste Mal war dies in der Fakultätsfunktion. Das Vertauschen der Reihenfolge der Operanden der Multiplikation hat einen großen Unterschied bewirkt.) Wie der Multiplikationsalgorithmus funktioniert (nur für den Fall, dass Sie neugierig sind.)
Ohne weiteres:
┌────────────────────────────────────┐ ┌─────────────────┐
│ ┌─┴─╖ ╓───╖ ┌─┴─╖ ┌──────┐ │
│ ┌─────────────┤ · ╟─╢ Ӂ ╟─┤ · ╟───┤ │ │
│ │ ╘═╤═╝ ╙─┬─╜ ╘═╤═╝ ┌─┴─╖ │ │
│ │ └─────┴─────┘ │ ♯ ║ │ │
│ ┌─┴─╖ ╘═╤═╝ │ │
│ ┌────────────┤ · ╟───────────────────────────────┴───┐ │ │
┌─┴─╖ ┌─┴─╖ ┌────╖ ╘═╤═╝ ┌──────────┐ ┌────────┐ ┌─┴─╖│ │
│ ♭ ║ │ × ╟───┤ >> ╟───┴───┘ ┌─┴─╖ │ ┌────╖ └─┤ · ╟┴┐ │
╘═╤═╝ ╘═╤═╝ ╘══╤═╝ ┌─────┤ · ╟───────┴─┤ << ╟─┐ ╘═╤═╝ │ │
┌───────┴─────┘ ┌────╖ │ │ ╘═╤═╝ ╘══╤═╝ │ │ │ │
│ ┌─────────┤ >> ╟─┘ │ └───────┐ │ │ │ │ │
│ │ ╘══╤═╝ ┌─┴─╖ ╔═══╗ ┌─┴─╖ ┌┐ │ │ ┌─┴─╖ │ │
│ │ ┌┴┐ ┌───────┤ ♫ ║ ┌─╢ 0 ║ ┌─┤ · ╟─┤├─┤ ├─┤ Ӝ ║ │ │
│ │ ╔═══╗ └┬┘ │ ╘═╤═╝ │ ╚═╤═╝ │ ╘═╤═╝ └┘ │ │ ╘═╤═╝ │ │
│ │ ║ 1 ╟───┬┘ ┌─┴─╖ └───┘ ┌─┴─╖ │ │ │ │ │ ┌─┴─╖ │
│ │ ╚═══╝ ┌─┴─╖ │ ɓ ╟─────────────┤ ? ╟─┘ │ ┌─┴─╖ │ ├─┤ · ╟─┴─┐
│ ├─────────┤ · ╟─┐ ╘═╤═╝ ╘═╤═╝ ┌─┴────┤ + ╟─┘ │ ╘═╤═╝ │
┌─┴─╖ ┌─┴─╖ ╘═╤═╝ │ ╔═╧═╕ ╔═══╗ ┌───╖ ┌─┴─╖ ┌─┴─╖ ╘═══╝ │ │ │
┌─┤ · ╟─┤ · ╟───┐ └┐ └─╢ ├─╢ 0 ╟─┤ ⌑ ╟─┤ ? ╟─┤ · ╟──────────────┘ │ │
│ ╘═╤═╝ ╘═╤═╝ └───┐ ┌┴┐ ╚═╤═╛ ╚═╤═╝ ╘═══╝ ╘═╤═╝ ╘═╤═╝ │ │
│ │ ┌─┴─╖ ┌───╖ │ └┬┘ ┌─┴─╖ ┌─┘ │ │ │ │
│ ┌─┴───┤ · ╟─┤ Җ ╟─┘ └────┤ ? ╟─┴─┐ ┌─────────────┘ │ │
│ │ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │ │╔════╗╔════╗ │ │
│ │ │ ┌──┴─╖ ┌┐ ┌┐ ┌─┴─╖ ┌─┴─╖ │║ 10 ║║ 32 ║ ┌─────────────────┘ │
│ │ │ │ << ╟─┤├─┬─┤├─┤ · ╟─┤ · ╟─┘╚══╤═╝╚╤═══╝ ┌──┴──┐ │
│ │ │ ╘══╤═╝ └┘ │ └┘ ╘═╤═╝ ╘═╤═╝ │ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ │
│ │ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ╔═╧═╕ └─┤ ? ╟─┤ · ╟─┤ % ║ │
│ └─────┤ · ╟─┤ · ╟──┤ Ӂ ╟──┤ ɱ ╟─╢ ├───┐ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │
│ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═══╝ ╚═╤═╛ ┌─┴─╖ ┌─┴─╖ │ └────────────────────┘
│ └─────┤ │ └───┤ ‼ ╟─┤ ‼ ║ │ ┌──────┐
│ │ │ ╘═══╝ ╘═╤═╝ │ │ ┌────┴────╖
│ │ │ ┌─┴─╖ │ │ │ str→int ║
│ │ └──────────────────────┤ · ╟───┴─┐ │ ╘════╤════╝
│ │ ┌─────────╖ ╘═╤═╝ │ ╔═╧═╗ ┌──┴──┐
│ └──────────┤ int→str ╟──────────┘ │ ║ ║ │ ┌───┴───┐
│ ╘═════════╝ │ ╚═══╝ │ │ ┌───╖ │
└───────────────────────────────────────────────────────┘ │ └─┤ × ╟─┘
┌──────────────┐ ╔═══╗ │ ╘═╤═╝
╔════╗ │ ╓───╖ ┌───╖ │ ┌───╢ 0 ║ │ ┌─┴─╖ ╔═══╗
║ −1 ║ └─╢ Ӝ ╟─┤ × ╟──┴──────┐ │ ╚═╤═╝ └───┤ Ӂ ╟─╢ 0 ║
╚═╤══╝ ╙───╜ ╘═╤═╝ │ │ ┌─┴─╖ ╘═╤═╝ ╚═══╝
┌─┴──╖ ┌┐ ┌───╖ ┌┐ ┌─┴──╖ ╔════╗ │ │ ┌─┤ ╟───────┴───────┐
│ << ╟─┤├─┤ ÷ ╟─┤├─┤ << ║ ║ −1 ║ │ │ │ └─┬─╜ ┌─┐ ┌─────┐ │
╘═╤══╝ └┘ ╘═╤═╝ └┘ ╘═╤══╝ ╚═╤══╝ │ │ │ └───┴─┘ │ ┌─┴─╖ │
│ └─┘ └──────┘ │ │ └───────────┘ ┌─┤ ? ╟─┘
└──────────────────────────────┘ ╓───╖ └───────────────┘ ╘═╤═╝
┌───────────╢ Җ ╟────────────┐ │
┌────────────────────────┴───┐ ╙───╜ │
│ ┌─┴────────────────────┐ ┌─┴─╖
┌─┴─╖ ┌─┴─╖ ┌─┴─┤ · ╟──────────────────┐
│ ♯ ║ ┌────────────────────┤ · ╟───────┐ │ ╘═╤═╝ │
╘═╤═╝ │ ╘═╤═╝ │ │ │ ┌───╖ │
┌─────┴───┘ ┌─────────────────┴─┐ ┌───┴───┐ ┌─┴─╖ ┌─┴─╖ ┌─┤ × ╟─┴─┐
│ │ ┌─┴─╖ │ ┌───┴────┤ · ╟─┤ · ╟──────────┤ ╘═╤═╝ │
│ │ ┌───╖ ┌───╖ ┌──┤ · ╟─┘ ┌─┴─┐ ╘═╤═╝ ╘═╤═╝ ┌─┴─╖ │ │
│ ┌────┴─┤ ♭ ╟─┤ × ╟──┘ ╘═╤═╝ │ ┌─┴─╖ ┌───╖└┐ ┌──┴─╖ ┌─┤ · ╟─┘ │
│ │ ╘═══╝ ╘═╤═╝ ┌───╖ │ │ │ × ╟─┤ Ӝ ╟─┴─┤ ÷% ╟─┐ │ ╘═╤═╝ ┌───╖ │
│ ┌─────┴───┐ ┌────┴───┤ Ӝ ╟─┴─┐ │ ╘═╤═╝ ╘═╤═╝ ╘══╤═╝ │ │ └───┤ Ӝ ╟─┘
│ ┌─┴─╖ ┌───╖ │ │ ┌────╖ ╘═╤═╝ │ └───┘ ┌─┴─╖ │ │ └────┐ ╘═╤═╝
│ │ × ╟─┤ Ӝ ╟─┘ └─┤ << ╟───┘ ┌─┴─╖ ┌───────┤ · ╟───┐ │ ┌─┴─╖ ┌───╖ │ │
│ ╘═╤═╝ ╘═╤═╝ ╘══╤═╝ ┌───┤ + ║ │ ╘═╤═╝ ├──┴─┤ · ╟─┤ × ╟─┘ │
└───┤ └────┐ ╔═══╗ ┌─┴─╖ ┌─┴─╖ ╘═╤═╝ │ ╔═══╗ ┌─┴─╖ ┌─┴─╖ ╘═╤═╝ ╘═╤═╝ │
┌─┴─╖ ┌────╖ │ ║ 0 ╟─┤ ? ╟─┤ = ║ ┌┴┐ │ ║ 0 ╟─┤ ? ╟─┤ = ║ │ │ ┌────╖ │
│ × ╟─┤ << ╟─┘ ╚═══╝ ╘═╤═╝ ╘═╤═╝ └┬┘ │ ╚═══╝ ╘═╤═╝ ╘═╤═╝ │ └─┤ << ╟─┘
╘═╤═╝ ╘═╤══╝ ┌┐ ┌┐ │ │ └───┘ ┌─┴─╖ ├──────┘ ╘═╤══╝
│ └────┤├──┬──┤├─┘ ├─────────────────┤ · ╟───┘ │
│ └┘┌─┴─╖└┘ │ ┌┐ ┌┐ ╘═╤═╝ ┌┐ ┌┐ │
└────────────┤ · ╟─────────┘ ┌─┤├─┬─┤├─┐ └───┤├─┬─┤├────────────┘
╘═╤═╝ │ └┘ │ └┘ │ └┘ │ └┘
└───────────────┘ │ └────────────┘
Erklärung der ersten Version
Die erste Version brauchte ungefähr eine Stunde, um n = 7 zu lösen . Im Folgenden wird hauptsächlich die Funktionsweise dieser langsamen Version erläutert. Unten erkläre ich, welche Änderung ich vorgenommen habe, um es auf unter 10 Minuten zu bringen.
Ein Ausflug in Bits
Dieses Programm benötigt Bits. Es braucht viele Teile, und es braucht sie an den richtigen Stellen. Erfahrene Funciton-Programmierer wissen bereits, dass Sie die Formel verwenden können , wenn Sie n Bits benötigen
was in Funciton ausgedrückt werden kann als
Bei der Leistungsoptimierung ist mir aufgefallen, dass ich mit dieser Formel den gleichen Wert viel schneller berechnen kann:
Ich hoffe, Sie verzeihen mir, dass ich nicht alle Gleichungsgrafiken in diesem Beitrag entsprechend aktualisiert habe.
Angenommen, Sie möchten keinen zusammenhängenden Bitblock. Tatsächlich möchten Sie in regelmäßigen Abständen n Bits für jedes k- te Bit, wie folgt:
LSB
↓
00000010000001000000100000010000001
└──┬──┘
k
Die Formel dafür ist ziemlich einfach, sobald Sie es wissen:
Im Code nimmt die Funktion Ӝ
die Werte n und k und berechnet diese Formel.
Verfolgen Sie die verwendeten Nummern
Es gibt n ² Zahlen in dem letzten Raster, und jede Zahl kann eine beliebige sein , n mögliche Werte. Um davon zu halten Spurnummern in jeder Zelle erlaubt sind, halten wir eine Reihe , bestehend aus n ³ Bits, in dem ein Bit gesetzt wird , um anzuzeigen , dass ein bestimmte Wert genommen wird. Anfangs ist diese Zahl offensichtlich 0.
Der Algorithmus beginnt in der rechten unteren Ecke. Nachdem die erste Zahl eine 0 ist, müssen wir nachverfolgen, dass die 0 in keiner Zelle in derselben Zeile, Spalte und Diagonale mehr zulässig ist:
LSB (example n=5)
↓
10000 00000 00000 00000 10000
00000 10000 00000 00000 10000
00000 00000 10000 00000 10000
00000 00000 00000 10000 10000
10000 10000 10000 10000 10000
↑
MSB
Zu diesem Zweck berechnen wir die folgenden vier Werte:
Aktuelle Zeile: Wir müssen n Bits jedes n - te Bit (einer pro Zelle), und es dann auf die aktuelle Zeile verschieben r , jede Reihe enthält Erinnerung n ² Bits:
Aktuelle Spalte: Wir brauchen n Bits jedes n ²-te Bit (eine pro Zeile), und es dann zu der aktuellen Spalte verschieben c , jede Spalte enthält die Erinnerung n Bits:
Vorwärtsdiagonale: Wir brauchen n Bits pro ... (Haben Sie aufgepasst? Schnell, finden Sie es heraus!) ... n ( n +1) Bit (gut gemacht!), Aber nur, wenn wir tatsächlich eingeschaltet sind die Vorwärtsdiagonale:
Rückwärtsdiagonale: Zwei Dinge hier. Erstens, woher wissen wir, ob wir uns in der Rückwärtsdiagonale befinden? Mathematisch ist die Bedingung c = ( n - 1) - r , was dasselbe ist wie c = n + (- r - 1). Hey, erinnert dich das an etwas? Das ist richtig, es ist das Zweierkomplement, also können wir die bitweise Negation (sehr effizient in Funciton) anstelle der Dekrementierung verwenden. Zweitens wird in der obigen Formel davon ausgegangen, dass das niedrigstwertige Bit gesetzt werden soll, in der Rückwärtsdiagonale jedoch nicht. Wir müssen es also um ... Wissen Sie, ... nach oben verschieben. Richtig, n ( n - 1).
Dies ist auch die einzige, bei der wir möglicherweise durch 0 dividieren, wenn n = 1. Funciton ist dies jedoch egal. 0 ÷ 0 ist nur 0, weißt du nicht?
Im Code nimmt die Funktion Җ
(die unterste) n und einen Index (aus dem r und c durch Division und Rest berechnet werden), berechnet diese vier Werte und or
s sie zusammen.
Der Brute-Force-Algorithmus
Der Brute-Force-Algorithmus wird von Ӂ
(der Funktion oben) implementiert . Es dauert n (die Rastergröße), Index (wo im Netz sind wir derzeit eine Reihe platzieren) und genommen (die Zahl mit n ³ Bits sagt uns , welche Zahlen wir können nach wie vor in jeder Zelle).
Diese Funktion gibt eine Folge von Zeichenfolgen zurück. Jede Zeichenfolge ist eine vollständige Lösung für das Raster. Es ist ein vollständiger Löser; es würde alle Lösungen zurückgeben, wenn Sie es zulassen, aber es gibt sie als eine verzögert bewertete Sequenz zurück.
Wenn der Index 0 erreicht hat, haben wir das gesamte Raster erfolgreich ausgefüllt, sodass wir eine Sequenz zurückgeben, die die leere Zeichenfolge enthält (eine einzelne Lösung, die keine der Zellen abdeckt). Die leere Zeichenfolge ist 0
und wir verwenden die Bibliotheksfunktion ⌑
, um daraus eine Einzelelementsequenz zu machen.
Die unten unter Leistungsverbesserung beschriebene Überprüfung findet hier statt.
Wenn der Index noch nicht 0 erreicht hat, dekrementieren wir ihn um 1, um den Index zu erhalten, bei dem wir jetzt eine Zahl platzieren müssen (nennen Sie das ix ).
Wir ♫
erzeugen damit eine Lazy-Sequenz mit den Werten von 0 bis n - 1.
Dann verwenden wir ɓ
(monadic bind) mit einem Lambda, das die folgenden Schritte ausführt:
- Schauen Sie sich zuerst das betreffende Bit an , um zu entscheiden, ob die Nummer hier gültig ist oder nicht. Wir können eine Zahl i genau dann setzen , wenn & (1 << ( n × ix ) << i ) nicht bereits gesetzt ist. Wenn es gesetzt ist, kehren Sie zurück
0
(leere Sequenz).
- Verwenden Sie
Җ
diese Option , um die Bits zu berechnen, die der aktuellen Zeile, Spalte und Diagonale (n) entsprechen. Verschieben sie durch i und dann or
es auf genommen .
- Rufen Sie rekursiv
Ӂ
auf, um alle Lösungen für die verbleibenden Zellen abzurufen, und übergeben Sie die neue genommene und die dekrementierte ix . Dies gibt eine Folge unvollständiger Zeichenfolgen zurück. Jede Zeichenfolge enthält ix Zeichen (das Raster ist bis zum Index ix ausgefüllt ).
- Verwenden Sie
ɱ
(map), um die auf diese Weise gefundenen Lösungen durchzugehen, und verwenden Sie, ‼
um i bis zum Ende jeder zu verketten . Fügen Sie eine neue Zeile hinzu, wenn der Index ein Vielfaches von n ist , andernfalls ein Leerzeichen.
Ergebnis generieren
Die wichtigsten Programmaufrufe Ӂ
(die Brute Forcer) mit n , index = n ² (erinnern wir die Gitter nach hinten füllen) und genommen = 0 (zunächst nichts genommen wird). Wenn das Ergebnis eine leere Sequenz ist (keine Lösung gefunden), geben Sie den leeren String aus. Andernfalls geben Sie die erste Zeichenfolge in der Sequenz aus. Beachten Sie, dass dies bedeutet, dass nur das erste Element der Sequenz ausgewertet wird. Aus diesem Grund wird der Solver erst fortgesetzt, wenn alle Lösungen gefunden wurden.
Leistungsverbesserung
(Für diejenigen, die bereits die alte Version der Erklärung gelesen haben: Das Programm generiert keine Sequenz von Sequenzen mehr, die separat in einen String für die Ausgabe umgewandelt werden müssen. Es generiert nur noch eine Sequenz von Strings direkt. Ich habe die Erklärung entsprechend bearbeitet.) Aber das war nicht die Hauptverbesserung. Hier kommt es.)
Auf meinem Computer dauerte die kompilierte Exe der ersten Version ziemlich genau 1 Stunde, um n = 7 zu lösen . Dies war nicht innerhalb des vorgegebenen Zeitlimits von 10 Minuten, so dass ich mich nicht ausruhte. (Nun, eigentlich war der Grund, warum ich mich nicht ausgeruht habe, die Idee, wie ich es massiv beschleunigen kann.)
Der oben beschriebene Algorithmus stoppt seine Suche und geht jedes Mal zurück, wenn er auf eine Zelle stößt, in der alle Bits der aufgenommenen Zahl gesetzt sind, was anzeigt, dass nichts in diese Zelle eingegeben werden kann.
Der Algorithmus füllt jedoch weiterhin zwecklos das Gitter bis zu der Zelle, in der alle diese Bits gesetzt sind. Es wäre viel schneller, wenn es aufhören könnte, sobald in einer noch auszufüllenden Zelle bereits alle Bits gesetzt sind, was bereits darauf hinweist, dass wir den Rest des Gitters niemals lösen können, egal welche Zahlen wir eingeben es. Aber wie können Sie effizient prüfen, ob in einer Zelle n Bits gesetzt sind, ohne alle zu durchlaufen?
Der Trick beginnt mit dem Hinzufügen eines einzelnen Bits pro Zelle zur aufgenommenen Zahl. Anstelle dessen, was oben gezeigt wurde, sieht es jetzt so aus:
LSB (example n=5)
↓
10000 0 00000 0 00000 0 00000 0 10000 0
00000 0 10000 0 00000 0 00000 0 10000 0
00000 0 00000 0 10000 0 00000 0 10000 0
00000 0 00000 0 00000 0 10000 0 10000 0
10000 0 10000 0 10000 0 10000 0 10000 0
↑
MSB
Anstelle von n ³, gibt es nun n ² ( n + 1) Bits in dieser Nummer. Die Funktion, die die aktuelle Zeile / Spalte / Diagonale ausfüllt, wurde entsprechend geändert (tatsächlich, um ehrlich zu sein, komplett neu geschrieben). Diese Funktion füllt jedoch nur n Bits pro Zelle, so dass das soeben hinzugefügte zusätzliche Bit immer vorhanden ist 0
.
Nehmen wir an, wir sind 1
in der Mitte der Berechnung und haben gerade ein in die mittlere Zelle gestellt. Die aufgenommene Zahl sieht ungefähr so aus:
current
LSB column (example n=5)
↓ ↓
11111 0 10010 0 01101 0 11100 0 11101 0
00011 0 11110 0 01101 0 11101 0 11100 0
11111 0 11110 0[11101 0]11100 0 11100 0 ← current row
11111 0 11111 0 11111 0 11111 0 11111 0
11111 0 11111 0 11111 0 11111 0 11111 0
↑
MSB
Wie Sie sehen, sind die obere linke Zelle (Index 0) und die mittlere linke Zelle (Index 10) jetzt nicht mehr möglich. Wie bestimmen wir dies am effizientesten?
Betrachten Sie eine Zahl, bei der das 0. Bit jeder Zelle gesetzt ist, jedoch nur bis zum aktuellen Index. Eine solche Zahl lässt sich leicht mit der bekannten Formel berechnen:
Was würden wir bekommen, wenn wir diese beiden Zahlen addieren würden?
LSB LSB
↓ ↓
11111 0 10010 0 01101 0 11100 0 11101 0 10000 0 10000 0 10000 0 10000 0 10000 0 ╓───╖
00011 0 11110 0 01101 0 11101 0 11100 0 ║ 10000 0 10000 0 10000 0 10000 0 10000 0 ║
11111 0 11110 0 11101 0 11100 0 11100 0 ═══╬═══ 10000 0 10000 0 00000 0 00000 0 00000 0 ═════ ╓─╜
11111 0 11111 0 11111 0 11111 0 11111 0 ║ 00000 0 00000 0 00000 0 00000 0 00000 0 ═════ ╨
11111 0 11111 0 11111 0 11111 0 11111 0 00000 0 00000 0 00000 0 00000 0 00000 0 o
↑ ↑
MSB MSB
Das Ergebnis ist:
OMG
↓
00000[1]01010 0 11101 0 00010 0 00011 0
10011 0 00001 0 11101 0 00011 0 00010 0
═════ 00000[1]00001 0 00011 0 11100 0 11100 0
═════ 11111 0 11111 0 11111 0 11111 0 11111 0
11111 0 11111 0 11111 0 11111 0 11111 0
Wie Sie sehen, fließt die Addition in das zusätzliche Bit, das wir hinzugefügt haben, über, aber nur, wenn alle Bits für diese Zelle gesetzt sind! Aus diesem Grund müssen Sie nur diese Bits ausblenden (gleiche Formel wie oben, aber << n ) und prüfen, ob das Ergebnis 0 ist:
00000[1]01010 0 11101 0 00010 0 00011 0 ╓╖ 00000 1 00000 1 00000 1 00000 1 00000 1 ╓─╖ ╓───╖
10011 0 00001 0 11101 0 00011 0 00010 0 ╓╜╙╖ 00000 1 00000 1 00000 1 00000 1 00000 1 ╓╜ ╙╖ ║
00000[1]00001 0 00011 0 11100 0 11100 0 ╙╥╥╜ 00000 1 00000 1 00000 0 00000 0 00000 0 ═════ ║ ║ ╓─╜
11111 0 11111 0 11111 0 11111 0 11111 0 ╓╜╙╥╜ 00000 0 00000 0 00000 0 00000 0 00000 0 ═════ ╙╖ ╓╜ ╨
11111 0 11111 0 11111 0 11111 0 11111 0 ╙──╨─ 00000 0 00000 0 00000 0 00000 0 00000 0 ╙─╜ o
Wenn es nicht Null ist, ist das Gitter unmöglich und wir können aufhören.
- Screenshot mit Lösung und Laufzeit für n = 4 bis 7.