Ziel des Spiels Flood Paint ist es, das gesamte Spielfeld in so wenigen Runden wie möglich in der gleichen Farbe zu halten.
Das Spiel beginnt mit einem Brett, das ungefähr so aussieht:
3 3 5 4 1 3 4 1 5
5 1 3 4 1 1 5 2 1
6 5 2 3 4 3 3 4 3
4 4 4 5 5 5 4 1 4
6 2 5 3[3]1 1 6 6
5 5 1 2 5 2 6 6 3
6 1 1 5 3 6 2 3 6
1 2 2 4 5 3 5 1 2
3 6 6 1 5 1 3 2 4
Gegenwärtig ist die Zahl (die eine Farbe darstellt) in der Mitte des Bretts 3. Bei jeder Runde ändert das Quadrat in der Mitte die Farbe und alle Quadrate derselben Farbe, die von der Mitte aus durch horizontales oder vertikales Bewegen erreichbar sind ( dh im Flutbereich des mittleren Quadrats) ändert sich die Farbe damit. Also, wenn das mittlere Quadrat die Farbe auf 5 ändert:
3 3 5 4 1 3 4 1 5
5 1 3 4 1 1 5 2 1
6 5 2 3 4 3 3 4 3
4 4 4 5 5 5 4 1 4
6 2 5 5[5]1 1 6 6
5 5 1 2 5 2 6 6 3
6 1 1 5 3 6 2 3 6
1 2 2 4 5 3 5 1 2
3 6 6 1 5 1 3 2 4
dann ändert auch die 3 links von der mittleren 3 die Farbe. Jetzt gibt es insgesamt sieben 5er, die von der Mitte aus erreichbar sind. Wenn wir also die Farbe in 4 ändern, gilt Folgendes:
3 3 5 4 1 3 4 1 5
5 1 3 4 1 1 5 2 1
6 5 2 3 4 3 3 4 3
4 4 4 4 4 4 4 1 4
6 2 4 4[4]1 1 6 6
5 5 1 2 4 2 6 6 3
6 1 1 5 3 6 2 3 6
1 2 2 4 5 3 5 1 2
3 6 6 1 5 1 3 2 4
der gemalte Bereich vergrößert sich erneut dramatisch.
Ihre Aufgabe ist es, ein Programm zu erstellen, das ein 19-mal-19-Farbraster von 1 bis 6 als Eingabe verwendet, in welcher Form auch immer Sie sich entscheiden:
4 5 1 1 2 2 1 6 2 6 3 4 2 3 2 3 1 6 3
4 2 6 3 4 4 5 6 4 4 5 3 3 3 3 5 4 3 4
2 3 5 2 2 5 5 1 2 6 2 6 6 2 1 6 6 1 2
4 6 5 5 5 5 4 1 6 6 3 2 6 4 2 6 3 6 6
1 6 4 4 4 4 6 4 2 5 5 3 2 2 4 1 5 2 5
1 6 2 1 5 1 6 4 4 1 5 1 3 4 5 2 3 4 1
3 3 5 3 2 2 2 4 2 1 6 6 6 6 1 4 5 2 5
1 6 1 3 2 4 1 3 3 4 6 5 1 5 5 3 4 3 3
4 4 1 5 5 1 4 6 3 3 4 5 5 6 1 6 2 6 4
1 4 2 5 6 5 5 3 2 5 5 5 3 6 1 4 4 6 6
4 6 6 2 6 6 2 4 2 6 1 5 6 2 3 3 4 3 6
6 1 3 6 3 5 5 3 6 1 3 4 4 5 1 2 6 4 3
2 6 1 3 2 4 2 6 1 1 5 2 6 6 6 6 3 3 3
3 4 5 4 6 6 3 3 4 1 1 6 4 5 1 3 4 1 2
4 2 6 4 1 5 3 6 4 3 4 5 4 2 1 1 4 1 1
4 2 4 1 5 2 2 3 6 6 6 5 2 5 4 5 4 5 1
5 6 2 3 4 6 5 4 1 3 2 3 2 1 3 6 2 2 4
6 5 4 1 3 2 2 1 1 1 6 1 2 6 2 5 6 4 5
5 1 1 4 2 6 2 5 6 1 3 3 4 1 6 1 2 1 2
und gib eine Folge von Farben zurück, die das mittlere Quadrat bei jeder Runde ändert, wieder im Format deiner Wahl:
263142421236425431645152623645465646213545631465
Am Ende jeder Zugsequenz müssen die Quadrate im 19-mal-19-Raster alle dieselbe Farbe haben.
Ihr Programm muss vollständig deterministisch sein. Pseudozufallslösungen sind zulässig, aber das Programm muss jedes Mal dieselbe Ausgabe für denselben Testfall generieren.
Das siegreiche Programm löst mit nur wenigen Schritten alle 100.000 in dieser Datei gefundenen Testfälle (gezippte Textdatei, 14,23 MB). Wenn zwei Lösungen die gleiche Anzahl von Schritten ausführen (z. B. wenn beide die optimale Strategie gefunden haben), gewinnt das kürzere Programm.
BurntPizza hat ein Programm in Java geschrieben, um die Testergebnisse zu überprüfen. Um dieses Programm zu verwenden, führen Sie Ihre Übermittlung aus und leiten Sie die Ausgabe an eine Datei mit dem Namen steps.txt
. Führen Sie dann dieses Programm mit steps.txt
und der floodtest
Datei in demselben Verzeichnis aus. Wenn Ihre Eingabe gültig ist und korrekte Lösungen für alle Dateien liefert, sollte sie alle Tests bestehen und zurückkehrenAll boards solved successfully.
import java.io.*;
import java.util.*;
public class PainterVerifier {
public static void main(String[] args) throws FileNotFoundException {
char[] board = new char[361];
Scanner s = new Scanner(new File("steps.txt"));
Scanner b = new Scanner(new File("floodtest"));
int lineNum = 0;
caseloop: while (b.hasNextLine()) {
for (int l = 0; l < 19; l++) {
String lineb = b.nextLine();
if (lineb.isEmpty())
continue caseloop;
System.arraycopy(lineb.toCharArray(), 0, board, l * 19, 19);
}
String line = s.nextLine();
if (line.isEmpty())
continue;
char[] steps = line.toCharArray();
Stack<Integer> nodes = new Stack<Integer>();
for (char c : steps) {
char targetColor = board[180];
char replacementColor = c;
nodes.push(180);
while (!nodes.empty()) {
int n = nodes.pop();
if (n < 0 || n > 360)
continue;
if (board[n] == targetColor) {
board[n] = replacementColor;
if (n % 19 > 0)
nodes.push(n - 1);
if (n % 19 < 18)
nodes.push(n + 1);
if (n / 19 > 0)
nodes.push(n - 19);
if (n / 19 < 18)
nodes.push(n + 19);
}
}
}
char center = board[180];
for (char c : board)
if (c != center) {
s.close();
b.close();
System.out.println("\nIncomplete board found!\n\tOn line " + lineNum + " of steps.txt");
System.exit(0);
}
if (lineNum % 5000 == 0)
System.out.printf("Verification %d%c complete...\n", lineNum * 100 / 100000, '%');
lineNum++;
}
s.close();
b.close();
System.out.println("All boards solved successfully.");
}
}
Auch ein Scoreboard, da die Ergebnisse eigentlich nicht nach Punktzahl sortiert sind und es hier eigentlich sehr darauf ankommt:
- 1,985,078 - smack42, Java
- 2,075,452 - user1502040, C
- 2,098,382 - tigrou, C #
- 2,155,834 - CoderTao, C #
- 2,201,995 - MrBackend, Java
- 2.383.569 - CoderTao, C #
- 2.384.020 - Herjan, C
- 2 403 189 - Origineil, Java
- 2,445,761 - Herjan, C
- 2,475,056 - Jeremy List, Haskell
- 2,480,714 - SteelTermite, C (2,395 Byte)
- 2,480,714 - Herjan, Java (4,702 Byte)
- 2.588.847 - BurntPizza, Java (2.748 Byte)
- 2.588.847 - Gero3, node.js (4.641 Byte)
- 2 979 145 - Teun Pronk, Delphi XE3
- 4,780,841 - BurntPizza, Java
- 10.800.000 - Joe Z., Python
Antworten:
Java - 1.985.078 Schritte
https://github.com/smack42/ColorFill
Noch ein verspäteter Einstieg. Die Ergebnisdatei mit den 1.985.078 Schritten finden Sie hier .
Einige Hintergrundinformationen:
Ich habe diese Herausforderung vor einigen Jahren entdeckt, als ich anfing, meinen eigenen Klon des Spiels Flood-it zu programmieren.
"Best-of-Incomplete" -DFS- und A * -Algorithmus
Von Anfang an wollte ich einen guten Lösungsalgorithmus für dieses Spiel erstellen. Mit der Zeit konnte ich meinen Solver verbessern, indem ich mehrere Strategien einbezog, die unterschiedliche unvollständige Suchen ausführten (ähnlich denjenigen, die in den anderen Programmen hier verwendet wurden), und indem ich das beste Ergebnis dieser Strategien für jede Lösung verwendete. Ich habe sogar den A * -Algorithmus von tigrou in Java erneut implementiert und meinem Solver hinzugefügt, um insgesamt bessere Lösungen als das Ergebnis von tigrou zu erzielen.
Umfassender DFS-Algorithmus
Dann habe ich mich auf einen Algorithmus konzentriert, der immer die optimalen Lösungen findet. Ich habe mich sehr bemüht, meine umfassende Tiefensuchstrategie zu optimieren. Um die Suche zu beschleunigen, habe ich eine Hashmap eingefügt, in der alle erkundeten Zustände gespeichert sind, sodass die Suche ein erneutes Erkunden dieser Zustände vermeiden kann. Während dieser Algorithmus gut funktioniert und alle 14x14-Rätsel schnell genug löst, verbraucht er zu viel Speicher und läuft mit den 19x19-Rätseln in dieser Code-Herausforderung sehr langsam.
Puchert A * -Algorithmus
Vor ein paar Monaten wurde ich kontaktiert, um den Flood-It-Löser von Aaron und Simon Puchert anzusehen . Dieses Programm verwendet einen Algorithmus vom Typ A * mit einer zulässigen Heuristik (im Gegensatz zu Tigrou) und einer Bewegungsbeschneidung ähnlich der Sprungpunktsuche. Mir ist schnell aufgefallen, dass dieses Programm sehr schnell ist und die optimalen Lösungen findet !
Natürlich musste ich diesen großartigen Algorithmus neu implementieren und zu meinem Programm hinzufügen. Ich habe versucht, mein Java-Programm so zu optimieren, dass es ungefähr so schnell läuft wie das ursprüngliche C ++ - Programm der Brüder Puchert. Dann habe ich mich entschlossen, die 100.000 Testfälle dieser Herausforderung auszuprobieren. Auf meinem Computer lief das Programm mehr als 120 Stunden, um die 1.985.078 Schritte zu finden, wobei ich den Puchert A * -Algorithmus implementierte .
Dies ist die bestmögliche Lösung für diese Herausforderung, es sei denn, das Programm enthält einige Fehler, die zu suboptimalen Lösungen führen würden. Jede Rückmeldung ist willkommen!
edit: fügte relevante Teile des Codes hier hinzu:
Klasse AStarPuchertStrategy
Teil der Klasse AStarSolver
Teil der Klasse AStarNode
quelle
C # - 2,098,382 Schritte
Ich probiere viele Dinge aus, die meisten scheitern und haben bis vor kurzem überhaupt nicht funktioniert. Ich habe etwas Interessantes, um eine Antwort zu schreiben.
Es gibt sicherlich Möglichkeiten, dies weiter zu verbessern. Ich denke, dass es möglich sein könnte, unter die 2M-Schritte zu gehen.
Es dauerte ca.
7 hours
Ergebnisse zu generieren. Hier ist eine txt-Datei mit allen Lösungen, falls jemand sie überprüfen möchte: results.zipWeitere Details zur Funktionsweise:
Es wird ein A * Pathfinding- Algorithmus verwendet.
Was schwierig ist, ist ein gutes zu finden
heuristic
. Wennheuristic
es die Kosten unterschätzt, funktioniert es fast wie der Dijkstra- Algorithmus und aufgrund der Komplexität eines 19x19-Boards mit 6 Farben wird es für immer laufen. Wenn es die Kosten überschätzt, kommt es schnell zu einer Lösung, aber es gibt überhaupt keine guten (26 Züge waren möglich, 19 waren möglich). Das Finden des Perfektenheuristic
, das die genaue verbleibende Menge an Schritten zum Erreichen der Lösung ergibt, wäre das Beste (es wäre schnell und würde die bestmögliche Lösung ergeben). Es ist (sofern ich mich nicht irre) unmöglich. Es ist tatsächlich erforderlich, zuerst das Brett selbst zu lösen, während Sie dies tatsächlich versuchen (Henne-Ei-Problem).Ich habe viele Dinge ausprobiert
heuristic
:node
stellt eine Reihe zusammenhängender, gleichfarbiger Quadrate dar. Auf diese Weisegraph
kann ich leicht den genauen Mindestabstand vom Mittelpunkt zu jedem anderen Knoten berechnen. Zum Beispiel wäre der Abstand von der Mitte nach links oben 10, da mindestens 10 Farben sie trennen.heuristic
: Ich spiele das aktuelle Brett bis zum Ende. Für jeden Schritt wähle ich die Farbe, mit der die Summe der Entfernungen von der Wurzel zu allen anderen Knoten minimiert wird.Die Anzahl der Züge, die benötigt werden, um dieses Ziel zu erreichen, ist die
heuristic
.Estimated cost
(verwendet von A *) =moves so far
+heuristic
Es ist nicht perfekt, da es die Kosten leicht überschätzt (daher wird keine optimale Lösung gefunden). Wie auch immer, es ist schnell zu berechnen und gute Ergebnisse zu liefern.
Ich konnte eine enorme Geschwindigkeitsverbesserung erzielen, indem ich alle Operationen mithilfe eines Diagramms ausführte. Am Anfang hatte ich eine
2-dimension
Reihe. Ich überschwemme es und berechne den Graphen bei Bedarf neu (zB um die Heuristik zu berechnen). Jetzt wird alles mit der Grafik erledigt, die erst am Anfang berechnet wurde. Um Schritte zu simulieren, wird keine Überflutung mehr benötigt. Stattdessen füge ich Knoten zusammen. Das geht viel schneller.quelle
code blocks
zum Hervorheben von Text verwenden. Wir haben es kursiv und fett geschrieben .Python - 10.800.000 Schritte
Betrachten Sie als letzte Referenzlösung die folgende Reihenfolge:
Durchlaufen Sie alle Farbzeiten, um
n
sicherzustellen, dass jedes Quadratn
in der gleichen Farbe wie das mittlere Quadrat ist. Jedes Quadrat ist höchstens 18 Schritte vom Zentrum entfernt, so dass 18 Zyklen garantieren, dass alle Quadrate die gleiche Farbe haben. Höchstwahrscheinlich dauert es weniger, aber das Programm muss nicht angehalten werden, sobald alle Quadrate dieselbe Farbe haben. Es ist einfach viel vorteilhafter, dies zu tun. Diese konstante Prozedur umfasst 108 Schritte pro Testfall mit insgesamt 10.800.000 Schritten.quelle
1 2 3 4 5 6 ...
statt deiner jetzigen Lösung was gibt123456...
.Java - 2.480.714 Schritte
Ich habe vorher einen kleinen Fehler gemacht (ich habe einen entscheidenden Satz vor eine Schleife gesetzt anstatt in die Schleife:
quelle
C - 2,075,452
Ich weiß, dass ich zu spät zur Party komme, aber ich habe diese Herausforderung gesehen und wollte es versuchen.
Der Algorithmus basiert auf der Monte-Carlo-Baumsuche mit Thompson-Abtastung und einer Transpositionstabelle zur Reduzierung des Suchraums. Es dauert ungefähr 12 Stunden auf meiner Maschine. Wenn Sie die Ergebnisse überprüfen möchten, finden Sie sie unter https://dropfile.to/pvjYDMV .
quelle
hash ^= zobrist_table[i][(int)solution[i]];
zuhash ^= zobrist_table[i%len][(int)solution[i]];
zu wechseln , um den Programmabsturz zu beheben.Java -
2.434.1082.588.847 SchritteDerzeit siegreich (~ 46K vor Herjan) am 26.4Welp, MrBackend hat mich also nicht nur geschlagen, sondern ich habe auch einen Fehler gefunden, der zu einem täuschend guten Ergebnis geführt hat. Es ist jetzt behoben (war auch im Verifier! Ack), aber leider habe ich im Moment keine Zeit, um zu versuchen, die Krone zurückzunehmen. Werde es später versuchen.
Dies basiert auf meiner anderen Lösung, aber anstatt mit der Farbe zu malen, die am häufigsten für die Füllkanten verwendet wird, wird mit der Farbe gemalt, die dazu führt, dass Kanten mit vielen benachbarten Quadraten derselben Farbe belichtet werden. Nennen Sie es LookAheadPainter. Ich werde es später bei Bedarf Golf spielen.
BEARBEITEN: Ich habe einen Prüfer geschrieben, den Sie gerne benutzen können. Er erwartet eine steps.txt-Datei, die die von Ihrem Programm ausgegebenen Schritte sowie die Floodtest-Datei enthält: Bearbeiten-Bearbeiten: (siehe OP)
Wenn jemand ein Problem findet, melde es mir bitte!
quelle
C - 2.480.714 Schritte
Immer noch nicht optimal, aber jetzt ist es schneller und punktet besser.
quelle
Java -
2.245.5292.201.995 SchritteParallele & Caching-Baumsuche in Tiefe 5, wodurch die Anzahl der "Inseln" minimiert wird. Da die Verbesserung von Tiefe 4 auf Tiefe 5 so gering war, halte ich es nicht für sinnvoll, sie noch weiter zu verbessern. Aber wenn es verbesserungswürdig sein sollte, sollte ich nach meinem Bauchgefühl die Anzahl der Inseln als Differenz zwischen zwei Staaten berechnen, anstatt alles neu zu berechnen.
Zur Zeit wird auf stdout ausgegeben, bis ich das Eingabeformat des Verifizierers kenne.
quelle
24
die, die zu einer wesentlich effizienteren Laufzeit führen würde.Mein letzter Eintrag: C - 2.384.020 Schritte
Diesmal ein Check-All-Moglichkeiten-Test ... Dieses Ergebnis wird mit einer Tiefe von 3 erzielt. Eine Tiefe von 5 sollte ~ 2,1M Schritte ergeben ... ZU LANGSAM. Die Tiefe 20+ gibt die geringstmögliche Anzahl von Schritten an (sie überprüft nur alle Übereinstimmungen und die kürzesten Gewinne) ... Sie hat die geringste Anzahl von Schritten, obwohl ich es hasse, da sie nur ein kleines bisschen besser ist, aber die Leistung ist mies. Ich bevorzuge meinen anderen C-Eintrag, der sich ebenfalls in diesem Beitrag befindet.
Eine weitere verbesserte KI in C - 2.445.761 Schritten
Basierend auf SteelTermite's:
quelle
Java -
2.610.7974.780.841 Schritte(Fill-Bug behoben, Score ist jetzt dramatisch schlechter -_-)
Dies ist meine grundlegende Vorlage für einen Referenzalgorithmus. Er erstellt einfach ein Histogramm der Quadrate an den Rändern des gemalten Bereichs und malt mit der am häufigsten verwendeten Farbe. Läuft die 100k in ein paar Minuten.
Offensichtlich wird nicht gewinnen, aber es ist sicherlich nicht zuletzt. Ich werde wahrscheinlich eine weitere Vorlage für clevere Sachen machen. Fühlen Sie sich frei, diesen Algorithmus als Ausgangspunkt zu verwenden.
Deaktivieren Sie die kommentierten Zeilen für die vollständige Ausgabe. Standardmäßig wird die Anzahl der durchgeführten Schritte gedruckt.
Golf auf 860 Zeichen (ohne die Zeilenumbrüche für die Formatierung), aber könnte mehr geschrumpft werden, wenn ich Lust hätte, es zu versuchen:
quelle
Haskell - 2.475.056 Schritte
Der Algorithmus ähnelt dem von MrBackend in den Kommentaren vorgeschlagenen. Der Unterschied ist: Sein Vorschlag findet den billigsten Weg zum höchsten Kostenquadrat, mein Vorschlag verringert gierig die Graphenexzentrizität bei jedem Schritt.
quelle
C # - 2.383.569
Es ist eine tiefgreifende Durchquerung möglicher Lösungen, die grob den Weg der besten Verbesserung wählt (ähnlich wie Herjans C-Eintrag), mit der Ausnahme, dass ich die Reihenfolge der Generierung der Lösungskandidaten geschickt umgekehrt habe, nachdem Herjan die gleichen Zahlen veröffentlicht hatte. Die Laufzeit beträgt jedoch mehr als 12 Stunden.
quelle
Java - 2.403.189
Dies sollte mein Versuch sein, eine brachiale Truppe zu gründen. Aber! Meine erste Implementierung der "besten" Wahl mit einer Tiefe ergab:
Der Code, der für beide verwendet wird, ist derselbe, wobei die Brute Force einen "Schnappschuss" der anderen möglichen Züge speichert und den Algorithmus über alle ausführt.
Wenn Sie mit dem "Multi" -Pass-Ansatz laufen, treten zufällige Fehler auf. Ich habe die ersten 100 Rätseleinträge in einem Komponententest erstellt und kann in 100% der Fälle einen 100% -igen Erfolg erzielen, aber nicht 100% der Zeit. Um das zu kompensieren, habe ich gerade die aktuelle Puzzle-Nummer zum Zeitpunkt des Ausfalls verfolgt und einen neuen Thread gestartet, der dort aufhob, wo der letzte aufgehört hat. Jeder Thread hat die entsprechenden Ergebnisse in eine Datei geschrieben. Der Dateipool wurde dann zu einer einzelnen Datei komprimiert.
Node
Stellt eine Kachel / ein Quadrat der Tafel dar und speichert einen Verweis auf alle Nachbarn. Verfolgen Sie dreiSet<Node>
Variablen:Remaining
,Painted
,Targets
. Bei jeder Iteration werdenTargets
allecandidate
Knoten nach Wert gruppiert undtarget value
nach der Anzahl der "betroffenen" Knoten ausgewählt. Diese betroffenen Knoten werden dann zu Zielen für die nächste Iteration.Die Quelle ist über viele Klassen verteilt und Ausschnitte sind außerhalb des Gesamtzusammenhangs nicht sehr aussagekräftig. Meine Quelle kann über GitHub durchsucht werden . Ich habe auch mit einer JSFiddle- Demo für die Visualisierung rumgespielt .
Trotzdem meine Arbeitspferdemethode von
Solver.java
:quelle
C # -
2.196.4622.155.834Dies ist im Grunde derselbe Ansatz zum Suchen nach dem besten Nachkommen wie bei meinem anderen Löser, aber mit ein paar Optimierungen, die es gerade noch erlauben, dass er mit Parallelität in etwas weniger als 10 Stunden in die Tiefe 5 geht. Während des Testens fand ich auch einen Fehler im Original, so dass der Algorithmus gelegentlich ineffiziente Routen zum Endzustand nahm (er berücksichtigte nicht die Tiefe von Zuständen mit einer Punktzahl von 64; entdeckt, während er mit Tiefenergebnissen spielte) = 7).
Der Hauptunterschied zwischen diesem und dem vorherigen Solver besteht darin, dass die Flutspielzustände im Speicher bleiben, sodass keine 6 ^ 5-Zustände regeneriert werden müssen. Aufgrund der CPU-Auslastung während des Betriebs bin ich mir ziemlich sicher, dass dies von der CPU-Begrenzung zur Speicherbandbreitenbegrenzung übergegangen ist. Viel Spaß. So viele Sünden.
Bearbeiten: Aus Gründen liefert der Algorithmus für Tiefe 5 nicht immer das beste Ergebnis. Um die Leistung zu verbessern, führen wir einfach die Schritte 5 ... und 4 ... sowie 3 und 2 und 1 aus, um herauszufinden, welcher am besten geeignet ist. Hat weitere 40k Moves abgeschabt. Da Tiefe 5 den größten Teil der Zeit ausmacht, erhöht das Hinzufügen von 4 bis 1 nur die Laufzeit von ~ 10 Stunden auf ~ 11 Stunden. Yay!
quelle
Delphi XE3 2.979.145 Schritte
Ok, das ist mein Versuch. Ich bezeichne den sich ändernden Teil als Blob. In jeder Runde wird eine Kopie des Arrays erstellt und jede mögliche Farbe getestet, um festzustellen, welche Farbe den größten Blob ergibt.
Führt alle Rätsel in 3 Stunden und 6 Minuten aus
Denken Sie auch an eine Bruteforce-Backtracing-Methode.
Vielleicht macht es Spaß für dieses Wochenende ^^
quelle
Javascript / node.js - 2.588.847
Algoritm unterscheidet sich etwas von den meisten hier, da vorberechnete Regionen und Differenzen zwischen den Berechnungen verwendet werden. Es läuft unter 10 Minuten hier, wenn Sie wegen Javascript über die Geschwindigkeit besorgt sind.
quelle
C-Code, der durch einfache Gewaltanwendung garantiert eine optimale Lösung findet. Funktioniert für Raster beliebiger Größe und alle Eingaben. Das Ausführen auf den meisten Gittern dauert sehr, sehr lange.
Die Flutfüllung ist äußerst ineffizient und beruht auf Rekursion. Möglicherweise müssen Sie Ihren Stapel vergrößern, wenn er sehr klein ist. Das Brute-Force-System verwendet eine Zeichenfolge zum Speichern der Zahlen und einfaches Add-with-Carry, um alle möglichen Optionen durchzugehen. Dies ist auch äußerst ineffizient, da es die meisten Schritte milliardenfach wiederholt.
Leider konnte ich es nicht mit allen Testfällen testen, da ich im Alter sterbe, bevor es zu Ende ist.
Soweit ich das beurteilen kann, ist dies der aktuelle Gewinner. Der Wettbewerb setzt voraus, dass:
Prüfen
Da dies immer die niedrigste Anzahl von Schritten findet, um jedes Board zu vervollständigen, und keiner der anderen, ist es derzeit an der Spitze. Wenn sich jemand ein kürzeres Programm einfallen lässt, kann er gewinnen. Deshalb präsentiere ich die folgende größenoptimierte Version. Die Ausführung ist etwas langsamer, aber die Ausführungszeit ist nicht Teil der Gewinnbedingungen:
quelle