在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 x 19网格中的正方形必须全部具有相同的颜色。
您的程序必须完全具有确定性。允许使用伪随机解,但是程序每次必须为相同的测试用例生成相同的输出。
获胜的程序将以最少的步骤总数来解决此文件(压缩文本文件,14.23 MB)中找到的所有100,000个测试用例。如果两个解决方案采用相同数量的步骤(例如,如果它们都找到了最佳策略),则较短的程序将获胜。
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 -tigrou,C#
- 2,155,834 -CoderTao,C#
- 2,201,995 -Java的MrBackend
- 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字节)
- 2,480,714 -Java的Herjan(4,702字节)
- 2,588,847 -BurntPizza,Java(2,748字节)
- 2,588,847 -Gero3,node.js(4,641字节)
- 2,979,145-德尔福XE3的Teun Pronk
- 4,780,841 -BurntPizza,Java
- 10,800,000 -Joe Z.,Python