Algoritma Menara Hanoi: Python, C++ Kode

Apa itu Menara Hanoi?

Menara Hanoi adalah teka-teki matematika yang terdiri dari tiga batang dan banyak cakram yang ditempatkan satu di atas yang lain. Menara ini juga dikenal sebagai Menara Brahma atau Menara Lucas, sebagaimana diperkenalkan oleh ahli matematika Prancis Edouard Lucas pada tahun 1883. Teka-teki ini didasarkan pada legenda tentang memindahkan piringan emas di antara tiga batang.

Teka-teki ini memiliki tiga batang dan sejumlah cakram bertumpuk. Batang-batang tersebut dirancang sebagai menara siklik. Jadi, piringan yang berdiameter lebih besar ditumpuk di bagian bawah, dan piringan yang lebih kecil ditumpuk di atas.

Awalnya kita diberikan tiga buah pasak atau batang. Dan salah satunya (A, ditunjukkan pada contoh) memiliki semua disk yang ditumpuk. Kami bertujuan untuk memindahkan seluruh tumpukan disk dari satu batang (A) ke batang lainnya (C) dengan mematuhi beberapa aturan tertentu.

Berikut adalah pengaturan awal teka-teki-

Masalah Menara Hanoi
Masalah Menara Hanoi

Dan ini adalah tujuan akhir-

Menara Hanoi

Aturan Menara Hanoi

Berikut beberapa aturan penting untuk Menara Hanoi:

  • Keadaan awal teka-teki ini, semua disk akan ditumpuk di batang satu.
  • Keadaan terakhir adalah semua disk dari batang satu akan ditumpuk pada batang dua atau batang tiga.
  • Kita dapat memindahkan sebuah on-disk dari satu batang ke batang lainnya pada waktu tertentu.
  • Kita hanya bisa memindahkan piringan paling atas dari batangnya.
  • Sebuah disk tidak dapat ditempatkan di atas disk lain, yang lebih kecil.

Legenda aslinya adalah tentang memindahkan 64 cakram. Para pendeta dapat memindahkan satu cakram pada satu waktu sesuai aturan. Menurut legenda, ada ramalan bahwa dunia akan kiamat jika mereka dapat menyelesaikan aksinya. Di bagian kompleksitas waktu, kami akan menunjukkan bahwa susunan n cakram di Menara Hanoi akan menghabiskan biaya 2^n – 1 gerakan.

Jadi, apabila para pendeta membutuhkan waktu 1 detik untuk menggerakkan cakram-cakram tersebut, total waktu yang mereka perlukan untuk memecahkan teka-teki tersebut adalah 2^64 – 1 detik atau 584,942,417,356 tahun, 26 hari, 7 jam, dan 15 detik.

Algoritma untuk Menara Hanoi

Salah satu cara umum untuk menyelesaikan Menara Hanoi adalah algoritma rekursif. Pertama, kita perlu menentukan dua batang atau pasak sebagai sumber dan tujuan, dan pasak cadangan akan menjadi pembantu atau penolong.

Berikut langkah-langkah memecahkan teka-teki Menara Hanoi:

  • Pindahkan disk n-1 teratas dari pasak sumber ke pasak pembantu.
  • Setelah itu, pindahkan disk ke-n dari pasak sumber ke pasak tujuan.
  • Terakhir, pindahkan sisa n-1 disk dari pasak pembantu ke pasak tujuan.

Note: Jika kita mempunyai satu disk, kita dapat langsung memindahkannya dari sumber ke tujuan.

Bagaimana memecahkan Puzzle Menara Hanoi

Mari kita ilustrasikan algoritma untuk tiga disk dan pertimbangkan pasak A sebagai sumber, pasak B sebagai pembantu, dan pasak C sebagai tujuan.

Langkah 1) Awalnya, semua disk akan ditumpuk di pasak A.

Pecahkan Puzzle Menara Hanoi

Di panggung ini:

Sumber = Pasak A
Tujuan = Pasak C
Pembantu = Pasak B

Sekarang, kita perlu memindahkan disk n-1 teratas dari sumber ke helper.

Catatan: Meskipun kita hanya dapat memindahkan satu disk dalam satu waktu, hal ini akan memecah masalah kita dari masalah 3 disk menjadi masalah 2 disk, yang merupakan panggilan rekursif.

Langkah 2) Saat kita memanggil panggilan rekursif dari pasak A dan tujuannya adalah pasak B, kita akan menggunakan pasak C sebagai pembantu.

Perhatikan bahwa kita berada pada tahap pertama lagi untuk masalah menara Hanoi yang sama untuk dua disk.

Sekarang kita perlu memindahkan n-1 atau satu disk dari sumber ke helper, memindahkan disk terkecil dari pasak A ke pasak C.

Pecahkan Puzzle Menara Hanoi

Di panggung ini:

Sumber = pasak A
Tujuan = pasak B
Pembantu = pasak C

Langkah 3) Kemudian, menurut algoritma kami, kebutuhan disk ke-n atau ke-2 harus ditransfer ke tujuan atau pasak B.

Pecahkan Puzzle Menara Hanoi

Di panggung ini:

Sumber = pasak A
Tujuan = pasak B
Pembantu = pasak C

Langkah 4) Sekarang, kita akan memindahkan n-1 disk atau disk satu dari helper atau pasak C ke tujuan atau pasak B sesuai dengan tahap ketiga dari algoritma kita.

Pecahkan Puzzle Menara Hanoi

Di panggung ini:

Sumber = pasak A
Tujuan = pasak B
Pembantu = pasak C

Langkah 5) Setelah menyelesaikan panggilan rekursif, kita akan kembali ke pengaturan sebelumnya saat tahap pertama algoritma.

Langkah 6) Nah pada tahap kedua kita akan memindahkan sumber kita ke tujuan kita yaitu memindahkan disk 3 ke pasak C dari pasak A.

Di panggung ini:

Sumber = pasak A
Tujuan = pasak C
Pembantu = pasak B

Langkah 7) Sekarang kita bisa melihatnya

Pecahkan Puzzle Menara Hanoi

d adalah memindahkan sisa disk dari helper (pasak B) ke tujuan (pasak C). Kita akan menggunakan sumber awal atau pasak A sebagai pembantu dalam kasus ini.

Langkah 8) Karena kita tidak dapat memindahkan dua disk secara bersamaan, kita akan memanggil panggilan rekursif untuk disk 1. Menurut langkah terakhir dan algoritma, tujuan pada langkah ini adalah pasak A.

Pecahkan Puzzle Menara Hanoi

Di panggung ini:

Sumber = pasak B
Tujuan = pasak A
Pembantu = pasak C

Langkah 9) Panggilan rekursif kami selesai sekarang. Kemudian kita pindahkan disk 2 dari sumbernya ke tujuannya.

Pecahkan Puzzle Menara Hanoi

Di panggung ini:

Sumber = pasak B
Tujuan = pasak C
Pembantu = pasak A

Langkah 10) Kemudian kita pindahkan sisa n-1 atau disk 1 dari helper ke tujuan.

Pecahkan Puzzle Menara Hanoi

Di panggung ini:

Sumber = pasak A
Tujuan = pasak C
Pembantu = pasak B

Kode Pseudo untuk Menara Hanoi

START
Procedure Tower_Of_Hanoi(disk, source, dest, helper)
  		IF disk == 1, THEN
      			move disk from source to dest             
   		ELSE
     			Tower_Of_Hanoi (disk - 1, source, helper, dest)     
      			move disk from source to dest          
      			Tower_Of_Hanoi (disk - 1, helper, dest, source)     
   		END IF   
END Procedure

Kode program masuk C++

#include <bits/stdc++.h>
using namespace std;
void tower_of_hanoi(int num, string source, string dest, string helper) {
  if (num == 1) {
    cout << " Move disk 1 from tower " << source << " to tower " << dest << endl;
    return;
  }
  tower_of_hanoi(num - 1, source, helper, dest);
  cout << " Move disk " << num << " from tower " << source << " to tower " << dest << endl;
  tower_of_hanoi(num - 1, helper, dest, source);
}
int main() {
  int num;
  cin >> num;
  printf("The sequence of moves :\n");
  tower_of_hanoi(num, "I", "III", "II");
  return 0;
}

Keluaran

3
The sequence of moves :
Move disk 1 from tower I to tower III
Move disk 2 from tower I to tower II
Move disk 1 from tower III to tower II
Move disk 3 from tower I to tower III
Move disk 1 from tower II to tower I
Move disk 2 from tower II to tower III
Move disk 1 from tower I to tower III

Kode program masuk Python

def tower_of_hanoi(n, source, destination, helper):
	if n==1:
		print ("Move disk 1 from peg", source," to peg", destination)
		return
	tower_of_hanoi(n-1, source, helper, destination)
	print ("Move disk",n," from peg", source," to peg", destination)
	tower_of_hanoi(n-1, helper, destination, source)		
# n = number of disks
n = 3
tower_of_hanoi(n,' A','B','C')

Keluaran:

Move disk 1 from peg A to peg B
Move disk 2 from peg A to peg C
Move disk 1 from peg B to peg C
Move disk 3 from peg A to peg B
Move disk 1 from peg C to peg A
Move disk 2 from peg C to peg B
Move disk 1 from peg A to peg B

Kompleksitas Menara Hanoi

Berikut adalah Kompleksitas Waktu dan Ruang Menara Hanoi:

1) Kompleksitas waktu:

Jika kita melihat kembali algoritma kita, kita dapat melihat bahwa kita memperkenalkan panggilan rekursif untuk disk (n-1) sebanyak dua kali. Panggilan rekursif untuk disk (n-1) tersebut dapat dipecah menjadi disk lain ((n-1)-1) dan seterusnya hingga kita hanya mendapatkan satu disk untuk dipindahkan.

Untuk tiga disk-

  • Disk 3 memanggil fungsi rekursif untuk disk dua dua kali.
  • Disk 2 memanggil fungsi rekursif untuk disk satu dua kali.
  • Disk 1 dapat bergerak dalam Waktu yang konstan, dan Waktu untuk menyelesaikan tiga disk.

= 2*(Waktu untuk menyelesaikan dua disk) + konstan Waktu untuk memindahkan disk 3

= 2*(2*waktu untuk menyelesaikan satu disk + konstan Waktu untuk memindahkan disk 2) + konstan Waktu untuk memindahkan disk 3

= (2*2) (waktu konstan untuk memindahkan disk 1) + 2*waktu konstan untuk memindahkan disk 2 + waktu konstan untuk memindahkan disk 3

Untuk n disk, dapat ditulis sebagai –

(2n-1 * waktu konstan untuk memindahkan disk 1 + 2n-2 *waktu konstan untuk memindahkan disk 2+….

Perkembangan geometri ini akan menghasilkan O(2n-1) atau O (2n), yang bersifat eksponensial.

2) Kompleksitas ruang

Kompleksitas ruang Menara Hanoi adalah 0(n). Itu karena kita perlu menyimpan urutan pelat. Saat kita menggunakan rekursi, kita menggunakan tumpukan. Dan ukuran maksimum tumpukan bisa menjadi "n." Itulah sebabnya kompleksitas ruang menjadi O(n).