Taşkın Boya oyununda, oyunun amacı tüm tahtanın mümkün olduğunca az renkte aynı renkte olmasını sağlamaktır.
Oyun şöyle görünen bir tahta ile başlar:
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
Şu anda, tahtanın ortasındaki (bir rengi temsil eden) sayı 3'tür. Her turda, merkezdeki kare rengi değiştirir ve aynı renkteki tüm kareler merkezden yatay veya dikey olarak hareket ettirilerek erişilebilir ( yani merkez meydanın sel bölgesinde) onunla renk değiştirecek. Öyleyse merkez kare 5 olarak renk değiştirirse:
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
o zaman merkezin 3 solundaki 3 de renk değiştirir. Şimdi, merkez olandan ulaşılabilecek toplam yedi 5 var ve eğer o zaman rengi 4 olarak değiştirirsek:
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
boyalı bölgenin büyüklüğü yine artmaktadır.
Göreviniz, seçtiğiniz formda, 1'den 6'ya 19'a 19 renk ızgarasını alabilecek bir program oluşturmaktır:
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
ve merkez karenin her bir turda değiştireceğiniz bir renk dizisini tekrar seçtiğiniz formatta döndürün:
263142421236425431645152623645465646213545631465
Her bir hareket sırasının sonunda, 19'a 19 ızgarasındaki karelerin hepsi aynı renkte olmalıdır.
Programınız tamamen belirleyici olmalı; sözde rasgele çözümlere izin verilir, ancak program her seferinde aynı test durumu için aynı çıktıyı üretmelidir.
Kazanan program, bu dosyada bulunan tüm 100.000 test durumunun (sıkıştırılmış metin dosyası, 14.23 MB) çözülmesi için en az sayıda adım atar . İki çözüm aynı adımı atarsa (örneğin, her ikisi de en uygun stratejiyi bulduysa), kısa program kazanacaktır.
BurntPizza, test sonuçlarını doğrulamak için Java'da bir program yazdı. Bu programı kullanmak için gönderinizi çalıştırın ve çıktıyı bir dosyaya gönderin steps.txt
. Ardından, bu programı steps.txt
ve floodtest
dosyayı aynı dizinde çalıştırın. Girişiniz geçerliyse ve tüm dosyalar için doğru çözümler üretirse, tüm testleri geçmeli ve geri dönmelidirAll 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.");
}
}
Ayrıca, bir skor tahtası, sonuçlar aslında skorlara göre sıralanmadığından ve burada gerçekten çok önemli:
- 1,985,078 - smack42, Java
- 2,075,452 - kullanıcı 1505040, 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 - Jeremy Listesi, Haskell
- 2,480,714 - SteelTermite, C (2,395 bayt)
- 2,480,714 - Herjan, Java (4,702 bayt)
- 2,588,847 - BurntPizza, Java (2.748 bayt)
- 2,588,847 - Gero3, node.js (4,641 bayt)
- 2,979,145 - Teun Pronk, Delphi XE3
- 4,780,841 - BurntPizza, Java
- 10.800.000 - Joe Z., Python