Dans le jeu Flood Paint, le but du jeu est de faire en sorte que le tableau entier soit de la même couleur en aussi peu de tours que possible.
Le jeu commence avec un tableau ressemblant à ceci:
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
Actuellement, le nombre (représentant une couleur) au centre du tableau est 3. Chaque tour, le carré au centre change de couleur et tous les carrés de la même couleur accessibles depuis le centre en se déplaçant horizontalement ou verticalement ( c'est-à-dire dans la zone inondée du carré central) changera de couleur avec elle. Donc, si le carré du centre change de couleur en 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
alors le 3 qui était à gauche du centre 3 changera également de couleur. Maintenant, il y a un total de sept 5 accessibles depuis le centre, et donc si nous changeons la couleur en 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 région peinte augmente de nouveau considérablement.
Votre tâche consiste à créer un programme prenant comme entrée une grille de couleurs 19-sur-19, sous la forme de votre choix:
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
et retourne une séquence de couleurs que le carré central va changer à chaque tour, toujours dans le format de votre choix:
263142421236425431645152623645465646213545631465
À la fin de chaque séquence de mouvements, les carrés de la grille 19 x 19 doivent tous être de la même couleur.
Votre programme doit être entièrement déterministe; Les solutions pseudo-aléatoires sont autorisées, mais le programme doit générer la même sortie pour le même scénario de test à chaque fois.
Le programme gagnant prendra le moins de mesures possible pour résoudre les 100 000 tests élémentaires contenus dans ce fichier (fichier texte compressé, 14,23 Mo). Si deux solutions prennent le même nombre d'étapes (par exemple, si les deux ont trouvé la stratégie optimale), le programme le plus court l'emportera.
BurntPizza a écrit un programme en Java pour vérifier les résultats du test. Pour utiliser ce programme, lancez votre soumission et dirigez la sortie vers un fichier appelé steps.txt
. Ensuite, exécutez ce programme avec steps.txt
et le floodtest
fichier dans le même répertoire. Si votre entrée est valide et produit des solutions correctes pour tous les fichiers, elle doit réussir tous les tests et renvoyerAll 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.");
}
}
En outre, un tableau de bord, puisque les résultats ne sont pas réellement triés par score et ici, cela compte beaucoup:
- 1 985 078 - smack42, Java
- 2 075 452 - utilisateur1502040, 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 octets)
- 2 480 714 - Herjan, Java (4 702 octets)
- 2 588 847 - BurntPizza, Java (2 748 octets)
- 2 588 847 - Gero3, node.js (4 641 octets)
- 2 979 145 - Teun Pronk, Delphi XE3
- 4 780 841 - BurntPizza, Java
- 10 800 000 - Joe Z., Python