W grze Flood Paint celem gry jest uzyskanie całej planszy w tym samym kolorze w jak najmniejszej liczbie tur.
Gra rozpoczyna się od planszy wyglądającej mniej więcej tak:
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
Obecnie liczba (reprezentująca kolor) na środku planszy wynosi 3. W każdej turze kwadrat w środku zmienia kolor, a wszystkie kwadraty tego samego koloru są osiągalne od środka, poruszając się poziomo lub pionowo ( tj. w rejonie zalewowym środkowego kwadratu) zmieni wraz z nim kolory. Jeśli więc środkowy kwadrat zmieni kolor na 5:
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
wtedy 3, które było na lewo od środkowej 3, również zmieni kolor. Teraz dostępnych jest siedem 5 z centrum, więc jeśli zmienimy kolor na 4:
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
obszar malowany ponownie dramatycznie powiększa się.
Twoim zadaniem jest stworzenie programu, który pobierze siatkę kolorów 19 na 19 od 1 do 6, w dowolnej formie:
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
i zwróć sekwencję kolorów, którą środkowy kwadrat będzie zmieniał w każdym zakręcie, ponownie w wybranym przez Ciebie formacie:
263142421236425431645152623645465646213545631465
Na końcu każdej sekwencji ruchów kwadraty na siatce 19 na 19 muszą być tego samego koloru.
Twój program musi być całkowicie deterministyczny; dozwolone są rozwiązania pseudolosowe, ale program musi za każdym razem generować to samo wyjście dla tego samego przypadku testowego.
Zwycięski program wykona najmniejszą liczbę kroków, aby rozwiązać wszystkie 100 000 przypadków testowych znalezionych w tym pliku (skompresowany plik tekstowy, 14,23 MB). Jeśli dwa rozwiązania wykonają tę samą liczbę kroków (np. Jeśli oba znalazły optymalną strategię), krótszy program wygra.
BurntPizza napisał program w Javie do weryfikacji wyników testu. Aby użyć tego programu, uruchom przesyłanie i potokuj dane wyjściowe do pliku o nazwie steps.txt
. Następnie uruchom ten program steps.txt
i floodtest
plik w tym samym katalogu. Jeśli twój wpis jest prawidłowy i daje prawidłowe rozwiązania dla wszystkich plików, powinien przejść wszystkie testy i zwrócićAll 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.");
}
}
Również tablica wyników, ponieważ wyniki nie są tak naprawdę sortowane według wyników, a tutaj ma to naprawdę duże znaczenie:
- 1 985,078 - smack42, Java
- 2 075 452 - użytkownik 1502040, 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
- 2480,714 - SteelTermite, C (2395 bajtów)
- 2480,714 - Herjan, Java (4702 bajty)
- 2588847 - BurntPizza, Java (2748 bajtów)
- 2 588 847 - Gero3, node.js (4 641 bajtów)
- 2 979 145 - Teun Pronk, Delphi XE3
- 4 780,841 - BurntPizza, Java
- 10 800 000 - Joe Z., Python