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も色が変わります。これで、中央の1から合計5つの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
ペイントされた領域のサイズは再び劇的に増加します。
あなたの仕事は、選択したどのような形式でも、入力として1から6までの19行19列の色を受け取るプログラムを作成することです。
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列のグリッドの正方形はすべて同じ色でなければなりません。
プログラムは完全に決定的でなければなりません。擬似ランダム解は許可されますが、プログラムは毎回同じテストケースに対して同じ出力を生成する必要があります。
受賞プログラムは、このファイル(zip形式のテキストファイル、14.23 MB)で見つかったすべての100,000個のテストケースを解決するために、最小限の手順で済みます。2つのソリューションのステップ数が同じ場合(たとえば、両方が最適な戦略を見つけた場合)、短いプログラムが勝ちます。
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#
- 2,155,834 -CoderTao、C#
- 2,201,995 -MrBackend、Java
- 2,383,569 -CoderTao、C#
- 2,384,020-ヘルヤン、C
- 2,403,189 -Origineil、ジャワ
- 2,445,761-ヘルヤン、C
- 2,475,056-ジェレミーリスト、ハスケル
- 2,480,714 -SteelTermite、C(2,395バイト)
- 2,480,714 -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