Video: Coding Minecraft in One Week - C++/OpenGL Programming Challenge 2024
Bu zorluk, disk sayısı göz önüne alındığında Hanoi Kuleleri'ni çözmek için gereken adımları basacak bir Java programı yazmak için programlama yeteneklerinizi kullanmanıza yardımcı olur.
The Towers of Hanoi üç dikey mandal ve çeşitli çaplarda disklerden oluşan klasik bir mantık bulmacasıdır. Her diskin ortasında bir delik vardır, böylece diskler mandalların üzerinden geçilebilir.
Bulmaca, mandallardan birinin üzerine istiflenmiş olan disklerin hepsiyle başlar, en büyük disk en altta ve en küçük en üsttedir. Bulmacanın amacı, disklerin yığınını diğer iki mandalın birine doğru hareket ettirmek ve yalnızca iki basit kurala uymaktır: (1) bir kerede yalnızca bir disk taşıyabilir ve (2) asla daha büyük bir disk yerleştiremezsiniz daha küçük olanın üstü.
Aşağıdaki resim, üç diskin bir yığınının çözümünü göstermektedir. Gördüğünüz gibi, çözüm yedi hamle gerektirir:
-
Disk 1'i Pim 1'den Pim 3'e Taşı.
-
Disk 2'yi Pim 1'den Pim 2'ye taşıyın.
-
Disk 1'i Pim 3'ten Pim 2'ye taşıyın.
-
Disk 3'ü Peg 1'den Peg 3'e taşıyın.
-
Disk 1'i Peg 2'den Peg 1'e taşıyın.
-
Disk 2'yi Peg 2'den Peg 3'e taşıyın.
-
Disk 1'i Peg 1'den Peg 3'e taşıyın.
Bu yedi adımdan sonra disk yığını Peg 3'te olacaktır.
Towers of Hanoi için çözüm üç diskler.Başlangıç konumuna disk eklemeye başladığınızda bulmaca ilginç hale geliyor. Üç disk ile, bulmaca çözmek için sadece 7 hamle gerekiyor. Dört disk ile 15 hamle gereklidir. Beş disk varsa, 31 hareket gerekecek. Altı disk 64 hamle gerektiriyor.
Matematiği takip ediyorsanız, bulmaca çözmek için gereken hamle sayısı disk sayısı arttıkça katlanarak artar. Örneğin, n diskleri taşımak için gereken hareket sayısı 2 n - 1'dir. Örneğin, 20 diskten oluşan bir yığın, 2 20 - 1 hamle gerektirir; Bu bir milyondan fazla hamle!
Bulmaca ilginç bir efsane ile bağlantılı: Hanoi'deki bir tapınakta keşişler, yeryüzünün oluşturulmasından bu yana 64 diskli bir Hanoi Kuleleri üzerinde çalışıyorlar. Bitince, dünya sona erecek. Neyse ki, beklemek uzun bir zamanımız var: keşişler saniyede bir disk oynatabiliyorlarsa, bulmacayı bitirmeden önce 580 milyar yıl daha sürecekler.
Sorununuz basit: Hanoi Kuleleri'ni çözmek için gereken adımları basacak bir Java programı yazınız. Disk sayısı göz önüne alındığında. Program ilk önce kullanıcıya disk sayısı sorar. Ardından, satır başına bir tane olmak üzere adımları görüntülemesi gerekir.Her adım, diskin hangi parçadan taşınacağı ve diskin hangi parçaya taşınacağı belirtilmelidir. Basamaklar da sıralı olarak numaralandırılmalıdır.
Bitirince, program tekrarlanmalı ve kullanıcıdan disk sayısını tekrar isteyecektir. Kullanıcı 0 girdiğinde program bitmelidir.
Programınızın üretmesi gereken konsol çıktı örneği:
Kaç disk? 1: 1 ila 3 2: 1 ila 2 3: 3 ila 2 4: 1 ila 3 5: 2 ila 1 6: 2 ila 3 7: 1 ila 3 Kaç tane disk (0 ila bitiş) ? (0 ile bitiş) 0 Bu zorluğu çözmenin tek zorunlusu çözümünüzün özyinelemeli programlamayı kullanmasıdır. Başka bir deyişle, çözümünüz bulmacayı çözmek için kendisini çağıran bir yöntem içermelidir.
Özyinelemeli programlama zor olabilir, bu nedenle bu bulmacanın çözümüne bir kaç ipucu:
Bulmaca üç payandadan oluşur. Bunlardan birinde disklerin başlangıç yığını bulunur; Bu perçin
-
kaynak pervazını olarak adlandırın. Geriye kalan iki mandaltan biri, disk yığınını taşımak istediğiniz bölmedir; Bu mandalı hedef pimi olarak adlandırın. Üçüncü mandal, onları taşırken geçici olarak diskleri depolamak için bir ara parça olarak kullanabilirsiniz. Bu mandalı yedek pimi olarak adlandırın. Özyinelemeli yönteminiz üç parametreyi kabul etmelidir: Taşılacak disk sayısı, kaynak dilimi ve hedef dil. Mandalları temsil etmek için 1, 2 ve 3 numaralı tamsayı değerlerini kullanın.
-
Bulmacayı yinelemeli olarak çözmenin temel fikri şudur: Bir yığın yığın yığını hedef kancaya taşımak için üç adım gerekir:
-
Alt disk haricindeki tüm diskleri yedek cıvata.
-
Orijinal destedeki en büyük diski hedef bölüme taşıyın.
-
Adım 1'de taşıdığınız istifi, yedek dişli çubuğundan hedef dişliye taşıyın.
-
Elbette, bulmaca kuralları bir kerede yalnızca bir disk taşımanıza izin verdiği için, burada verilen yordamın 1. ve 3. adımlarını yalnızca yığını toplayıp taşıyarak başaramazsınız. Adım 1 ve 3 için, yinelemeli olarak çağırırsınız; her seferinde taşınacak daha az disk belirtiliyor ve her seferinde önceki hedefi saplamayı yedek dişli olarak kullanıyorsunuz.
-
-
Özyinelemeli yöntemin neden yedek uçları bir argüman olarak kabul etmeye ihtiyacı olmadığını merak ediyor musunuz? Kaynak ve hedef paçavraları göz önüne alındığında, kolayca hesaplayabilirsiniz. 1, 2 ve 3 numaralı yalnızca üç payanda bulunduğundan, üç topuzun toplamı 6 (1 + 2 + 3) 'dır. Kaynak ve hedef dişlileri göz önüne alındığında, kaynak ve hedef dişliyi 6'dan çıkararak yedek dişliyi hesaplayabilirsiniz. Örneğin kaynak dişlisi 1 ve hedef dişlisi 3 olduğunda, yedek dişli ucu 2 olmalı, çünkü
-
6 - 3 - 1 = 2.
Çözüm için,
Java Öpücük için Hepsi Birarada> 4. Baskı ürün sayfasındaki İndirilenler sekmesine gidin. İyi şanslar!