Trong trò chơi Flood Paint, mục tiêu của trò chơi là làm cho toàn bộ bảng có cùng màu trong càng ít lượt càng tốt.
Trò chơi bắt đầu với một bảng trông giống như thế này:
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
Hiện tại, số (đại diện cho một màu) ở trung tâm của bảng là 3. Mỗi lượt, hình vuông ở giữa sẽ thay đổi màu và tất cả các hình vuông có cùng màu có thể tiếp cận từ trung tâm bằng cách di chuyển theo chiều ngang hoặc chiều dọc ( tức là trong vùng lũ của quảng trường trung tâm) sẽ thay đổi màu sắc với nó. Vì vậy, nếu hình vuông trung tâm đổi màu thành 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
sau đó 3 cái ở bên trái của trung tâm 3 cũng sẽ đổi màu. Bây giờ có tổng cộng bảy 5 có thể truy cập từ trung tâm một, và vì vậy nếu sau đó chúng ta thay đổi màu thành 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
vùng sơn lại tăng kích thước đáng kể.
Nhiệm vụ của bạn là tạo ra một chương trình sẽ lấy lưới màu 19 x 19 từ 1 đến 6 làm đầu vào, dưới bất kỳ hình thức nào bạn chọn:
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
và trả về một chuỗi các màu mà hình vuông trung tâm sẽ thay đổi theo từng lượt, một lần nữa theo định dạng bạn chọn:
263142421236425431645152623645465646213545631465
Vào cuối mỗi chuỗi di chuyển, các ô vuông trong lưới 19 x 19 phải có cùng màu.
Chương trình của bạn phải hoàn toàn xác định; Các giải pháp giả ngẫu nhiên được cho phép, nhưng chương trình phải tạo ra cùng một đầu ra cho cùng một trường hợp thử nghiệm mỗi lần.
Chương trình chiến thắng sẽ thực hiện tổng số bước ít nhất để giải quyết tất cả 100.000 trường hợp kiểm tra được tìm thấy trong tệp này (tệp văn bản được nén, 14,23 MB). Nếu hai giải pháp có cùng số bước (ví dụ: nếu cả hai đều tìm thấy chiến lược tối ưu), chương trình ngắn hơn sẽ giành chiến thắng.
BurntPizza đã viết một chương trình bằng Java để xác minh kết quả thử nghiệm. Để sử dụng chương trình này, hãy chạy trình của bạn và chuyển đầu ra thành một tệp có tên steps.txt
. Sau đó, chạy chương trình này với steps.txt
và floodtest
tệp trong cùng một thư mục. Nếu mục nhập của bạn hợp lệ và tạo ra các giải pháp chính xác cho tất cả các tệp, nó sẽ vượt qua tất cả các bài kiểm tra và trả về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.");
}
}
Ngoài ra, một bảng điểm, vì các kết quả không thực sự được sắp xếp theo điểm số và ở đây nó thực sự rất quan trọng:
- 1,985,078 - smack42, Java
- 2.075.452 - người dùng 1502040, C
- 2,098,382 - hổ báo, 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.485.056 - Danh sách Jeremy, 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