15 Puzzle adalah teka-teki terkenal yang melibatkan 15 ubin bergeser di sekitar kotak 4x4. Mulai dari konfigurasi acak, tujuannya adalah untuk mengatur ubin dalam urutan yang benar. Berikut adalah contoh dari 15 Puzzle yang dipecahkan:
01 02 03 04
05 06 07 08
09 10 11 12
13 14 15
Setiap gerakan pada puzzle adalah dalam bentuk Atas / Bawah / Kiri / Kanan. Langkah "Bawah" terdiri dari menggeser ubin yang ada di atas tempat kosong ke bawah. Langkah "Kanan" terdiri dari menggeser ubin ke kanan, ke tempat kosong. Berikut adalah tampilan papan setelah gerakan ke Bawah dan Kanan.
01 02 03 04
05 06 07 08
09 10 11
13 14 15 12
Tujuan dari tantangan ini adalah untuk menulis sebuah program yang dapat menghasilkan serangkaian langkah yang diperlukan untuk menyelesaikan 15 Puzzle. Pemenangnya adalah program yang menyelesaikan lima kasus uji (di bawah) dalam total gerakan paling sedikit. Solusi yang dihasilkan tidak perlu menjadi solusi yang sempurna, itu hanya harus lebih baik dari para pesaing. Untuk setiap kasus uji individual, program tidak boleh memakan waktu lebih dari sepuluh detik pada mesin yang masuk akal.
Program Anda harus dapat memecahkan setiap teka-teki yang dapat dipecahkan, saya hanya menggunakan lima test case ini sebagai skor.
Program Anda akan menerima 15 Puzzle yang belum terpecahkan sebagai input dalam format array 2D. Array 2D dapat diformat sesuai dengan bahasa yang digunakan, atau diubah jika bahasa tidak memiliki array 2D. Elemen pertama dari sub-array pertama adalah angka di kiri atas, dan elemen terakhir dari sub-array pertama adalah angka di kanan atas. A 0
akan menjadi ruang kosong.
Sebagai hasil, program Anda harus mencetak daftar gerakan dalam urutan yang harus dilakukan. Setiap langkah harus diberi nomor untuk meningkatkan kegunaan hasil.
EDIT: Berdasarkan komentar, saya akan mengizinkan output dalam bentuk Down / Up / etc atau dalam bentuk koordinat potongan untuk bergerak. Karena ini bukan kode golf, bagian terpenting adalah memecahkan teka-teki.
Beberapa aturan umum lainnya tidak boleh menggunakan sumber luar, dll.
Test Case 1
([5,1,7,3],[9,2,11,4],[13,6,15,8],[0,10,14,12])
Contoh Output:
1: Down
2: Down
3: Down
4: Left
....
Test Case 2
([2,5,13,12],[1,0,3,15],[9,7,14,6],[10,11,8,4])
Test Case 3
([5,2,4,8],[10,0,3,14],[13,6,11,12],[1,15,9,7])
Test Case 4
([11,4,12,2],[5,10,3,15],[14,1,6,7],[0,9,8,13])
Test Case 5
([5,8,7,11],[1,6,12,2],[9,0,13,10],[14,3,4,15])
sumber
Jawaban:
PyPy, 195 bergerak, ~ perhitungan 12 detik
Menghitung solusi optimal menggunakan IDA * dengan heuristik 'berjalan kaki' ditambah dengan konflik linear. Berikut adalah solusi optimal:
Dan kodenya:
sumber
JavaScript (ES6) total langkah 329 untuk semua 5 kasus uji dalam ~ 1 menit
Edit Strategi yang sama, target yang berbeda, solusi yang lebih baik. Lebih lambat ...
Ini lebih atau kurang bagaimana saya menyelesaikannya dengan tangan: menggunakan target menengah Setelah setiap target ubin relatif tidak dipindahkan lagi Setiap target menengah tercapai menggunakan fungsi BSF parametrik. 2 params adalah kondisi loop L (repeat while true) dan kondisi select S (pilih tile apa yang bisa dipindahkan). Langkah langkah:
Catatan sisi Saya tidak memeriksa posisi ubin 14 dan 15. Teka-teki yang tidak dapat dipecahkan seperti
[11,4,12,2,,15,10,3,5,,14,1,6,7,,0,9,8,13]
memiliki 14 dan 15 ditukar.Buka cuplikan untuk diuji atau mainkan (khusus Firefox)
Tampilkan cuplikan kode
Test suite Di konsol Firefox / FireBug
Keluaran
sumber
Saya mulai mengerjakan masalah ini dan ingin berkontribusi dengan kode saya sejauh ini. Seperti yang dinyatakan oleh Gareth, masalahnya adalah sebanding dengan puzzle 8-ubin dan kode ini didasarkan pada solusi Keith Randall yang lebih baik dan dengan demikian dalam Python. Solusi ini dapat menyelesaikan semua 5 kasus uji dengan jumlah total kurang dari 400 gerakan, dan juga teka-teki lainnya. Ini berisi solusi yang dioptimalkan dan brute force. Kode sudah agak membengkak sekarang. Output disingkat seperti "llururd .." Semoga bermanfaat. http://www.penschuck.org/joomla/tmp/15Tile.txt (penjelasan) http://www.penschuck.org/joomla/tmp/tile15.txt (kode python)
sumber