Nel gioco di Flood Paint, l'obiettivo del gioco è quello di far sì che l'intero tabellone abbia lo stesso colore nel minor numero di turni possibile.
Il gioco inizia con una tavola simile a questa:
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
Attualmente, il numero (che rappresenta un colore) al centro del tabellone è 3. Ad ogni giro, il quadrato al centro cambierà colore e tutti i quadrati dello stesso colore che sono raggiungibili dal centro spostandosi in orizzontale o in verticale ( cioè nella regione di inondazione della piazza centrale) cambierà i colori con esso. Quindi se il quadrato centrale cambia colore in 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
allora anche il 3 che era alla sinistra del centro 3 cambierà colore. Ora ci sono un totale di sette 5 raggiungibili da quello centrale, quindi se cambiamo colore in 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
la regione dipinta aumenta di nuovo in modo drammatico.
Il tuo compito è quello di creare un programma che prenderà come input una griglia di colori 19 per 19 da 1 a 6, in qualunque forma tu scelga:
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
e restituisci una sequenza di colori che il quadrato centrale cambierà ad ogni giro, sempre nel formato che preferisci:
263142421236425431645152623645465646213545631465
Alla fine di ogni sequenza di mosse, i quadrati nella griglia 19 per 19 devono essere tutti dello stesso colore.
Il tuo programma deve essere del tutto deterministico; Sono consentite soluzioni pseudocasuali, ma il programma deve sempre generare lo stesso output per lo stesso test case.
Il programma vincente prenderà il minor numero totale di passaggi per risolvere tutti i 100.000 casi di test trovati in questo file (file di testo compresso, 14,23 MB). Se due soluzioni eseguono lo stesso numero di passaggi (ad es. Se entrambi hanno trovato la strategia ottimale), vincerà il programma più breve.
BurntPizza ha scritto un programma in Java per verificare i risultati del test. Per utilizzare questo programma, esegui l'invio e convoglia l'output in un file chiamato steps.txt
. Quindi, eseguire questo programma con steps.txt
e il floodtest
file nella stessa directory. Se la tua voce è valida e produce soluzioni corrette per tutti i file, dovrebbe superare tutti i test e restituireAll 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.");
}
}
Inoltre, un tabellone segnapunti, dal momento che i risultati non sono effettivamente ordinati per punteggio e qui conta davvero molto:
- 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