В игре Flood Paint, цель игры - сделать так, чтобы все поле было одинакового цвета за как можно меньшее число ходов.
Игра начинается с доски, которая выглядит примерно так:
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
В настоящее время число (представляющее цвет) в центре доски равно 3. Каждый ход квадрат в центре будет менять цвет, и все квадраты одного цвета, которые достижимы из центра, перемещаясь по горизонтали или по вертикали ( т.е. в зоне затопления центральной площади) будет меняться с ним цвета. Так что если центральный квадрат меняет цвет на 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
тогда 3, которая была слева от центра 3, также изменит цвет. Теперь из центральной можно добраться до семи пятерок, и поэтому, если мы затем изменим цвет на 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
окрашенная область снова резко увеличивается в размерах.
Ваша задача - создать программу, которая будет принимать сетку цветов 19 на 19 от 1 до 6 в любой выбранной вами форме:
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
и верните последовательность цветов, которую центральный квадрат будет менять для каждого хода, снова в формате по вашему выбору:
263142421236425431645152623645465646213545631465
В конце каждой последовательности ходов квадраты в сетке 19 на 19 должны быть одного цвета.
Ваша программа должна быть полностью детерминированной; разрешены псевдослучайные решения, но программа должна генерировать один и тот же вывод каждый раз для одного и того же теста.
Программа-победитель предпримет наименьшее общее количество шагов для решения всех 100 000 тестовых случаев, найденных в этом файле (заархивированный текстовый файл, 14,23 МБ). Если два решения предпримут одинаковое количество шагов (например, если они оба нашли оптимальную стратегию), победит более короткая программа.
BurntPizza написал программу на Java для проверки результатов теста. Чтобы использовать эту программу, запустите ваше представление и передайте вывод в файл с именем steps.txt
. Затем запустите эту программу с steps.txt
и floodtest
файл в том же каталоге. Если ваша запись верна и дает правильные решения для всех файлов, она должна пройти все тесты и вернуться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.");
}
}
Кроме того, табло, так как результаты на самом деле не отсортированы по баллам, и здесь это действительно имеет большое значение:
- 1,985,078 - smack42, Java
- 2,075,452 - user1502040, C
- 2,098,382 - тигру, C #
- 2155834 - 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 - Джереми Лист, Хаскелл
- 2 480 714 - SteelTermite, C (2 395 байт)
- 2 480 714 - Herjan, Java (4 702 байта)
- 2,588,847 - BurntPizza, Java (2748 байт)
- 2,588,847 - Gero3, node.js (4,641 байт)
- 2 979 145 - Теун Пронк, Delphi XE3
- 4,780,841 - BurntPizza, Java
- 10 800 000 - Джо З., Питон