En el juego de Flood Paint, el objetivo del juego es conseguir que todo el tablero sea del mismo color en el menor número de turnos posible.
El juego comienza con un tablero que se parece a esto:
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
Actualmente, el número (que representa un color) en el centro del tablero es 3. Cada turno, el cuadrado en el centro cambiará de color, y todos los cuadrados del mismo color que son accesibles desde el centro moviéndose horizontal o verticalmente ( es decir, en la región de inundación del cuadrado central) cambiará los colores con él. Entonces, si el cuadrado central cambia de color a 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
entonces el 3 que estaba a la izquierda del centro 3 también cambiará de color. Ahora hay un total de siete 5's accesibles desde el centro, y si cambiamos de color a 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 región pintada nuevamente aumenta de tamaño dramáticamente.
Su tarea es crear un programa que tome una cuadrícula de colores de 19 por 19 del 1 al 6 como entrada, en cualquier forma que elija:
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
y devuelve una secuencia de colores que el cuadrado central cambiará en cada turno, nuevamente en el formato que elija:
263142421236425431645152623645465646213545631465
Al final de cada secuencia de movimientos, los cuadrados en la cuadrícula de 19 por 19 deben ser todos del mismo color.
Su programa debe ser completamente determinista; Se permiten soluciones pseudoaleatorias, pero el programa debe generar la misma salida para el mismo caso de prueba cada vez.
El programa ganador tomará la menor cantidad total de pasos para resolver los 100,000 casos de prueba encontrados en este archivo (archivo de texto comprimido, 14.23 MB). Si dos soluciones toman el mismo número de pasos (por ejemplo, si ambos encontraron la estrategia óptima), el programa más corto ganará.
BurntPizza ha escrito un programa en Java para verificar los resultados de la prueba. Para usar este programa, ejecute su envío y canalice la salida a un archivo llamado steps.txt
. Luego, ejecute este programa con steps.txt
y el floodtest
archivo en el mismo directorio. Si su entrada es válida y produce soluciones correctas para todos los archivos, debe pasar todas las pruebas y regresarAll 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.");
}
}
Además, un marcador, ya que los resultados no están ordenados por puntaje y aquí realmente importa mucho:
- 1,985,078 - smack42, Java
- 2,075,452 - usuario1502040, 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 bytes)
- 2,480,714 - Herjan, Java (4,702 bytes)
- 2,588,847 - BurntPizza, Java (2,748 bytes)
- 2,588,847 - Gero3, node.js (4,641 bytes)
- 2.979.145 - Teun Pronk, Delphi XE3
- 4.780.841 - BurntPizza, Java
- 10,800,000 - Joe Z., Python