Jika Anda tidak tahu apa itu Menara Hanoi , saya akan jelaskan secara singkat: Ada tiga batang dan beberapa cakram yang masing-masing memiliki ukuran berbeda. Pada awalnya semua disc ada di menara pertama, dalam urutan: Urut terbesar ada di bawah, yang terkecil di atas. Tujuannya adalah untuk membawa semua cakram ke batang ketiga. Kedengarannya mudah? Inilah masalahnya: Anda tidak dapat menempatkan disk di atas disk yang lebih kecil dari disk lain; Anda hanya dapat memegang satu disk di tangan Anda pada satu waktu untuk memindahkannya ke batang lain dan Anda hanya dapat menempatkan disk pada batang, bukan di atas meja, Anda bajingan licik.
solusi contoh ascii:
A B C
| | |
_|_ | |
__|__ | |
A B C
| | |
| | |
__|__ _|_ |
A B C
| | |
| | |
| _|_ __|__
A B C
| | |
| | _|_
| | __|__
Tantangan
Ada tiga batang yang disebut A, B dan C. (Anda juga dapat memanggilnya 1,2 dan 3 dengan hormat jika itu membantu) Pada awalnya semua cakram ada pada batang A (1).
Tantangan Anda adalah memverifikasi solusi untuk menara hanoi. Anda harus memastikan bahwa:
- Pada akhirnya semua n disc berada di rod C (3).
- Untuk setiap disk yang diberikan pada kondisi tertentu tidak ada disk yang lebih kecil di bawahnya.
- Tidak ada kesalahan yang jelas seperti mencoba mengambil disk dari batang kosong atau memindahkan disk ke batang yang tidak ada.
(solusinya tidak harus optimal.)
Memasukkan
Program Anda akan menerima dua input:
- Jumlah cakram n (bilangan bulat)
Bergerak yang diambil, yang akan terdiri dari satu set tupel dari: (menara untuk mengambil disk paling atas dari saat ini), (menara untuk membawa disk ini ke) di mana masing-masing tupel mengacu pada suatu gerakan. Anda dapat memilih bagaimana mereka diwakili. Misalnya sesuatu seperti cara berikut untuk mewakili solusi untuk n = 2 yang telah saya gambar di ascii di atas. (Saya akan menggunakan yang pertama dalam test case, karena mudah di mata):
"A-> B; A-> C; B-> C"
[("A", "B"), ("A", "C"), ("B", "C")]
[(1,2), (1,3), (2,3)]
"ABACBC"
[1,2,1,3,2,3]
Keluaran
Sebenarnya, jika kondisi itu dapat ditemukan di bawah "tantangan" terus.
Falsy, jika tidak.
Kasus uji:
Benar:
n=1, "A->C"
n=1, "A->B ; B->C"
n=2, "A->B ; A->C ; B->C"
n=2, "A->C ; C->B ; A->C ; B->C"
n=2, "A->C ; A->B ; C->B ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=4, "A->B ; A->C ; B->C ; A->B ; C->A ; C->B ; A->B ; A->C ; B->C ; B->A ; C->A ; B->C ; A->B ; A->C ; B->C"
Salah:
Yang ketiga disarankan oleh @MartinEnder, 7th oleh @Joffan
n=1, "A->B"
n=1, "C->A"
n=2, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=2, "A->B ; A->C ; C->B"
n=2, "A->C ; A->B ; C->B ; B->A"
n=2, "A->C ; A->C"
n=3, "A->B ; A->D; A->C ; D->C ; A->C"
n=3, "A->C ; A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->B ; B->C ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; C->B"
n=4, "A->B ; A->C ; B->C ; A->B ; C->A ; C->B ; A->B ; A->C ; B->C ; B->A ; C->A ; B->C ; A->B ; A->C"
n=4, "A->B ; A->B ; A->B ; A->C ; B->C ; B->C ; B->C"
Ini adalah kode-golf , solusi terpendek yang menang. Aturan dan celah standar berlaku. Tidak termasuk baterai.
A->A
?
moving discs to nonexistant rods.
jadi tentu saja ya, iniD
A=1
,B=2
,C=3
, dll)?