Gambaran
Mutiara (atau Masyu) adalah permainan logika yang dimainkan di atas kisi-kisi. Ada mutiara hitam dan putih yang diletakkan di grid. Tujuannya adalah untuk membentuk satu loop tertutup yang berjalan melalui setiap mutiara hanya menggunakan segmen garis lurus dan sudut kanan.
Ada beberapa aturan yang mengatur bagaimana loop berinteraksi dengan mutiara:
- Mutiara putih harus dilalui langsung , tetapi loop harus berputar di sel sebelumnya dan / atau berikutnya di jalurnya.
- Mutiara hitam harus dihidupkan , tetapi loop harus berjalan lurus melalui sel berikutnya dan sebelumnya di jalurnya.
- Lingkaran tidak boleh melewati atau memotong sendiri. Semua sel memiliki persis nol atau dua loop masuk / keluar.
Contoh teka-teki dari Wikipedia (dan solusinya):
Tujuan Anda adalah untuk memecahkan teka-teki yang diberikan. Jika ada beberapa solusi yang mungkin, tidak masalah yang mana yang Anda berikan.
Memasukkan
Input akan berupa kotak persegi yang tidak terpecahkan . Contoh yang ditunjukkan di atas akan terlihat seperti ini:
..w.w.....
....w...b.
..b.b.w...
...w..w...
b....w...w
..w....w..
..b...w...
w...b....w
......ww..
..b......b
w
adalah mutiara putih, b
adalah mutiara hitam, dan .
merupakan sel kosong.
Asumsikan input valid. Ini berarti itu terbentuk dengan baik, dan setidaknya satu solusi mungkin. Semua puzzle yang valid setidaknya 3x3, dan mengandung setidaknya satu mutiara.
Keluaran
Output adalah serangkaian koordinat yang mewakili path. Sudut kiri atas grid adalah 0 0
, kanan atas adalah n-1 0
, di mana n adalah lebar grid.
Path hanyalah serangkaian koordinat yang diurutkan:
x1 y1 x2 y2 x3 y3 ...
Jalur diasumsikan ditutup, jadi Anda tidak perlu mengulang koordinat pertama di akhir, tetapi tidak ada penalti untuk melakukannya.
Output harus terdiri dari setidaknya semua sudut di jalan. Anda tidak harus mengeluarkan setiap sel di jalur jika tidak ada belokan. Misalnya, output untuk contoh dapat dimulai dengan:
1 0 5 0 5 1 ...
atau
1 0 2 0 3 0 4 0 5 0 5 1 ...
Keluaran seharusnya tidak mengandung sel yang tidak ada di jalur. Anda bisa mulai dari sel mana saja di jalur.
Potongan
Berikut cuplikan yang dapat Anda gunakan untuk memvisualisasikan solusi Anda. Cukup tempelkan di kisi yang sedang Anda kerjakan dan jalur yang Anda hasilkan. Saya sadar bahwa melihat kode saya itu menyakitkan, jadi saya sarankan Anda tidak;)
Uji Kasus
Kasing uji ini menunjukkan satu kemungkinan keluaran untuk setiap input (kecuali yang terakhir, yang ditunjukkan belum terpecahkan). Mungkin ada jalur lain yang valid, Anda mungkin pergi CW atau CCW atau mulai pada titik yang berbeda, dll. Solusi harus dapat menyelesaikan kasus uji dalam detik / menit / jam, bukan hari / minggu / ribuan tahun.
...
w..
..b
0 0 1 0 2 0 2 1 2 2 1 2 0 2 0 1
.wb..b
......
..b...
w.ww..
......
b....b
0 0 2 0 2 2 4 2 4 1 3 1 3 0 5 0 5 5 3 5 3 4 4 4 4 3 1 3 1 4 2 4 2 5 0 5 0 2 1 2 1 1 0 1
.....w.b.w..
ww..b...b...
.w.....b....
...wbww..b.b
....b.......
w.w.........
..w......b.b
.....bb.....
.....b.....w
w.ww..b.....
...w......w.
b..w.....b..
sumber
Jawaban:
C, 590
640 760 880 963 1018Brute force cukup cepat untuk ini. Tes 12x12 berjalan di bawah 10 ms. Mengetahui hal itu bisa memilih bahasa yang lebih tepat untuk bermain golf.
Saya tidak menganggap papan itu persegi karena teka-teki yang lebih besar cenderung tidak persegi.
Itu
W
mendefinisikan menetapkan batas pada dimensi papan. Batas aktual lebih kecilW - 2
karena saya menggunakan baris tambahan untuk batas untuk menghindari pemeriksaan batas.Ujilah aku .
Ini adalah ujian yang lebih menantang:
Saya beruntung kode saya menemukan solusinya cukup awal dalam menjalankan (<5 menit), tetapi pencarian lengkap membutuhkan waktu lebih lama (67 menit).
sumber
Python - 1669
Masih cukup panjang, tetapi cukup cepat untuk menjalankan contoh terakhir di bawah satu detik di komputer saya. Mungkin memungkinkan untuk membuat lebih pendek dengan biaya kecepatan, tetapi untuk saat ini cukup banyak setara dengan kode yang tidak diserobot.
Contoh output untuk test case terakhir:
Kode:
Tidak Disatukan:
sumber
Lua,
830810765752739729710Menjalankan board1 dan board2 baik-baik saja, tetapi membutuhkan waktu di board3.
Ini bisa menghemat 9 byte dengan mengeluarkan setiap jalur, bukan hanya yang pertama ...
sumber