ในเกม 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 MB) หากสองวิธีดำเนินการตามขั้นตอนจำนวนเท่ากัน (เช่นหากทั้งคู่พบกลยุทธ์ที่เหมาะสมที่สุด) โปรแกรมที่สั้นกว่าจะชนะ
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 - ผู้ใช้ 1502040, 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 - รายการเจเรมี, แฮสเคลล์
- 2,480,714 - SteelTermite, C (2,395 ไบต์)
- 2,480,714 - Herjan, Java (4,702 ไบต์)
- 2,588,847 - BurntPizza, Java (2,748 ไบต์)
- 2,588,847 - Gero3, node.js (4,641 ไบต์)
- 2,979,145 - Teun Pronk, Delphi XE3
- 4,780,841 - BurntPizza, Java
- 10,800,000 - Joe Z. , Python