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