У грі 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, також змінить колір. Зараз усього до семи 5 доступні від центральної, і якщо ми потім змінимо колір на 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 #
- 2155,834 - CoderTao, C #
- 2,201,995 - MrBackend, Java
- 2,383,569 - CoderTao, C #
- 2,384,020 - Гержан, С
- 2,403,189 - Origineil, Java
- 2,445,761 - Гержан, С
- 2,475,056 - Список Джеремі, Хаскелл
- 2,480,714 - SteelTermite, C (2395 байт)
- 2,480,714 - Herjan, Java (4,702 байт)
- 2,588,847 - BurntPizza, Java (2,748 байт)
- 2,588,847 - Gero3, node.js (4,641 байт)
- 2 799 145 - Teun Pronk, Delphi XE3
- 4,780,841 - BurntPizza, Java
- 10 800 000 - Джо З., Пітон