Hanoi Kulesi'nin ne olduğunu bilmiyorsanız , kısaca açıklayacağım: Her biri farklı boyutta olan üç çubuk ve bazı diskler var. Başlangıçta, tüm diskler ilk sırada, sıralı sıradadır: En büyüğü en alttaki, en küçüğü en üsttedir. Amaç tüm diskleri üçüncü çubuğa getirmektir. Kolay mı geliyor? İşte catch: Diski diğer diskten daha küçük olan bir diskin üzerine yerleştiremezsiniz; Bir seferde sadece bir diski elinizde tutabilirsiniz, başka bir çubuğa hareket ettirin ve diski yalnızca çubukların üzerine yerleştirebilirsiniz, masaya değil sinsi piç.
ascii örnek çözümü:
A B C
| | |
_|_ | |
__|__ | |
A B C
| | |
| | |
__|__ _|_ |
A B C
| | |
| | |
| _|_ __|__
A B C
| | |
| | _|_
| | __|__
Meydan okuma
A, B ve C diye adlandırılan üç çubuk var. (Eğer yardımcı olursa buna sırasıyla sırasıyla 1,2 ve 3 de diyebilirsiniz) Başlangıçta tüm n diskler A çubuğundadır (1).
Buradaki zorluk, hanoi kulesi için bir çözüm bulmak. Şunlardan emin olmanız gerekir:
- Sonunda, tüm n diskler C çubuğundadır (3).
- Belirli bir durumda verilen herhangi bir disk için, altında daha küçük bir disk yoktur.
- Diskleri boş bir çubuktan almaya çalışmak veya diskleri dayanılmaz çubuklara taşımak gibi açık bir hata yoktur.
(çözümün optimal olması gerekmez.)
Giriş
Programınız iki girdi alacak:
- Disk sayısı n (bir tam sayı)
Alınan hareketler, aşağıdakilerden oluşan bir dizi tuptan oluşacaktır: (şu anda en üstteki diski alma kulesi), (bu diski alma kulesi), burada her bir kaymanın bir hareketi ifade ettiği. Onların nasıl temsil edileceğini seçebilirsiniz. Örneğin, yukarıda ascii'de çizdiğim n = 2 için çözümü temsil eden aşağıdaki yollar gibi bir şey. (Test senaryosunda birincisini kullanacağım, çünkü gözlerde kolay):
"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]
Çıktı
Truthy, “meydan okuma” altında bulunabilecek koşullar geçerliyse.
Sahte, eğer değilse.
Test durumları:
Doğru:
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"
Yanlış:
@MartinEnder tarafından 7, @Joffan tarafından 7
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"
Bu kod golf , en kısa çözüm kazanır. Standart kurallar ve boşluklar geçerlidir. Pil yok.
A->A
?
moving discs to nonexistant rods.
tabii ki evet, bu birD
A=1
,B=2
,C=3
vs.)?