Dalam permainan Flood Paint, tujuan dari permainan ini adalah untuk membuat seluruh papan menjadi warna yang sama dalam beberapa putaran mungkin.
Gim dimulai dengan papan yang terlihat seperti ini:
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
Saat ini, angka (mewakili warna) di tengah papan adalah 3. Setiap belokan, persegi di pusat akan berubah warna, dan semua kotak dengan warna yang sama yang dapat dijangkau dari pusat dengan bergerak secara horizontal atau vertikal ( yaitu di wilayah banjir pusat alun-alun) akan berubah warna dengan itu. Jadi jika alun-alun pusat berubah warna menjadi 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
maka 3 yang ada di sebelah kiri tengah 3 juga akan berubah warna. Sekarang ada total tujuh 5 yang dapat dicapai dari satu pusat, dan jadi jika kita kemudian berubah warna menjadi 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
daerah yang dicat kembali bertambah besar secara dramatis.
Tugas Anda adalah membuat program yang akan mengambil kisi warna 19-by-19 dari 1 hingga 6 sebagai input, dalam bentuk apa pun yang Anda pilih:
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
dan kembalikan urutan warna yang akan diubah pusat persegi untuk setiap belokan, sekali lagi dalam format yang Anda pilih:
263142421236425431645152623645465646213545631465
Pada akhir setiap urutan gerakan, kotak dalam kisi 19-by-19 semuanya harus memiliki warna yang sama.
Program Anda harus sepenuhnya bersifat deterministik; solusi pseudorandom diperbolehkan, tetapi program harus menghasilkan output yang sama untuk test case yang sama setiap waktu.
Program yang menang akan mengambil jumlah langkah paling sedikit untuk menyelesaikan semua 100.000 kasus uji yang ditemukan dalam file ini (file teks zip, 14,23 MB). Jika dua solusi mengambil jumlah langkah yang sama (misalnya jika mereka berdua menemukan strategi yang optimal), program yang lebih pendek akan menang.
BurntPizza telah menulis sebuah program di Jawa untuk memverifikasi hasil pengujian. Untuk menggunakan program ini, jalankan kiriman Anda dan kirimkan output ke file bernama steps.txt
. Kemudian, jalankan program ini dengan steps.txt
dan floodtest
file di direktori yang sama. Jika entri Anda valid dan menghasilkan solusi yang benar untuk semua file, itu harus lulus semua tes dan kembaliAll 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.");
}
}
Juga, papan skor, karena hasilnya tidak benar-benar diurutkan berdasarkan skor dan di sini itu sangat penting:
- 1.985.078 - smack42, Jawa
- 2.075.452 - user1502040, C
- 2.098.382 - tigrou, C #
- 2.155.834 - CoderTao, C #
- 2.201.995 - MrBackend, Jawa
- 2.383.569 - CoderTao, C #
- 2.384.020 - Herjan, C
- 2.403.189 - Origineil, Jawa
- 2.445.761 - Herjan, C
- 2.475.056 - Daftar Jeremy, Haskell
- 2.480.714 - SteelTermite, C (2.395 byte)
- 2.480.714 - Herjan, Jawa (4,702 bytes)
- 2.588.847 - BurntPizza, Java (2,748 bytes)
- 2.588.847 - Gero3, node.js (4,641 bytes)
- 2.979.145 - Teun Pronk, Delphi XE3
- 4.780.841 - BurntPizza, Jawa
- 10.800.000 - Joe Z., Python