Program Menara Hanoi dengan
Menampilkan gerak
MENARA HANOI
Memindahkan sejumlah piringan dari
satu menara ke menara yang lain.
dengan syarat :
1.
Piringan
dipindahkan satu demi satu.
2.
Piringan
yang lebih kecil tidak boleh berada di bawah piringan yang lebih besar
3.
Menggunakan
3 buah menara yaitu :
o
Menara
Sumber : berisi piringan yang akan dipindahkan ( awal susunan
piringan )
o
Menara
Bantuan : membantu pemindahan piringan
o
Menara
Tujuan : akhir pemposisian piringan
Jika jumlah piringan yang akan
dipindahkan adalah sejumlah n piringan maka pemecahannya sebagai berikut :
1.
Jika n = 1
maka pindahkan dari Menara Sumber ke Menara Tujuan dan selesai
2.
Pindahkan
n-1 piringan dari menara Sumber ke Menara Bantuan, gunakan Menara Tujuan
sebagai Bantuan
3.
Pada Posisi
Piringan di Menara Sumber = n pindahkan langsung ke Menara Tujuan
4.
Pindahkan
sisa sejumlah n-1 piringan di Menara Bantuan ke Menara Tujuan, gunakan Menara
Sumber sebagai Bantuan
Pemindahan n-1 Piringan dilakukan
satu per satu dan tidak sekaligus, proses pemindahan piringan menggunakan
proses yang berulang-ulang ( recursion ).
Berikut Program penyelesaian Masalah
Menara Hanoi menggunakan Turbo Pascal dengan menampilkan pergerakannya.
Uses Crt;
Procedure MenaraHanoi
(Jumlah : Integer;
Sumber, Tujuan, Bantuan : Char;
Var Langkah, Jumlah_A, Jumlah_B, Jumlah_C, Waktu : Integer);
Var
Baris_Sumber, Kolom_Sumber, Baris_Tujuan, Kolom_Tujuan : Integer;
Begin
If Jumlah > 0 Then
Begin
MenaraHanoi(Jumlah-1,Sumber,Bantuan,Tujuan,Langkah,Jumlah_A,Jumlah_B,Jumlah_C,Waktu);
Langkah := Langkah+1;
If Sumber = 'A' Then
Begin
Kolom_Sumber := 30;
Baris_Sumber := 24 - Jumlah_A;
Jumlah_A := Jumlah_A - 1;
End
Else
If Sumber = 'B' Then
Begin
Kolom_Sumber := 40;
Baris_Sumber := 24 - Jumlah_B;
Jumlah_B := Jumlah_B - 1;
End
Else
Begin
Kolom_Sumber := 50;
Baris_Sumber := 24 - Jumlah_C;
Jumlah_C := Jumlah_C - 1;
End;
If Tujuan = 'A' Then
Begin
Kolom_Tujuan := 30;
Jumlah_A := Jumlah_A + 1;
Baris_Tujuan := 24 - Jumlah_A;
End
Else
If Tujuan = 'B' Then
Begin
Kolom_Tujuan := 40;
Jumlah_B := Jumlah_B + 1;
Baris_Tujuan := 24 - Jumlah_B;
End
Else
Begin
Kolom_Tujuan := 50;
Jumlah_C := Jumlah_C + 1;
Baris_Tujuan := 24 - Jumlah_C;
End;
Delay(Waktu*1000);
GotoXY(Kolom_Sumber, Baris_Sumber); Write(' ');
GotoXY(Kolom_Tujuan, Baris_Tujuan); Write(Jumlah);
GotoXY(18, 24); Write(Langkah);
MenaraHanoi(Jumlah-1,Bantuan,Tujuan,Sumber,Langkah,Jumlah_A,Jumlah_B,Jumlah_C,Waktu);
End;
End;
Var
Jumlah, Langkah, I, Baris, Jumlah_A, Jumlah_B, Jumlah_C, Waktu : Integer;
Sumber, Bantuan, Tujuan : Char;
Begin
Clrscr;
TextColor(Green); Write('Jumlah Piringan ?');
Readln(Jumlah);
TextColor(Green); Write('Waktu pemindahan (0-5) detik ?');
Readln(Waktu);
Clrscr;
GotoXY(25,24);Textcolor(2); Writeln(' Sumber Bantuan Tujuan ');
For I := Jumlah Downto 1 Do
Begin
Baris := 23 - (Jumlah - I);
GotoXY (30, Baris); Writeln(I);
End;
Langkah := 0;
Sumber := 'A';
Bantuan := 'B';
Tujuan := 'C';
Jumlah_A := Jumlah;
Jumlah_B := 0;
Jumlah_C := 0;
GotoXY(1,24); Writeln('Jumlah Langkah = ');
MenaraHanoi(Jumlah, Sumber,Tujuan,Bantuan,Langkah,Jumlah_A,Jumlah_B,Jumlah_C,Waktu);
Readln;
End.
Procedure MenaraHanoi
(Jumlah : Integer;
Sumber, Tujuan, Bantuan : Char;
Var Langkah, Jumlah_A, Jumlah_B, Jumlah_C, Waktu : Integer);
Var
Baris_Sumber, Kolom_Sumber, Baris_Tujuan, Kolom_Tujuan : Integer;
Begin
If Jumlah > 0 Then
Begin
MenaraHanoi(Jumlah-1,Sumber,Bantuan,Tujuan,Langkah,Jumlah_A,Jumlah_B,Jumlah_C,Waktu);
Langkah := Langkah+1;
If Sumber = 'A' Then
Begin
Kolom_Sumber := 30;
Baris_Sumber := 24 - Jumlah_A;
Jumlah_A := Jumlah_A - 1;
End
Else
If Sumber = 'B' Then
Begin
Kolom_Sumber := 40;
Baris_Sumber := 24 - Jumlah_B;
Jumlah_B := Jumlah_B - 1;
End
Else
Begin
Kolom_Sumber := 50;
Baris_Sumber := 24 - Jumlah_C;
Jumlah_C := Jumlah_C - 1;
End;
If Tujuan = 'A' Then
Begin
Kolom_Tujuan := 30;
Jumlah_A := Jumlah_A + 1;
Baris_Tujuan := 24 - Jumlah_A;
End
Else
If Tujuan = 'B' Then
Begin
Kolom_Tujuan := 40;
Jumlah_B := Jumlah_B + 1;
Baris_Tujuan := 24 - Jumlah_B;
End
Else
Begin
Kolom_Tujuan := 50;
Jumlah_C := Jumlah_C + 1;
Baris_Tujuan := 24 - Jumlah_C;
End;
Delay(Waktu*1000);
GotoXY(Kolom_Sumber, Baris_Sumber); Write(' ');
GotoXY(Kolom_Tujuan, Baris_Tujuan); Write(Jumlah);
GotoXY(18, 24); Write(Langkah);
MenaraHanoi(Jumlah-1,Bantuan,Tujuan,Sumber,Langkah,Jumlah_A,Jumlah_B,Jumlah_C,Waktu);
End;
End;
Var
Jumlah, Langkah, I, Baris, Jumlah_A, Jumlah_B, Jumlah_C, Waktu : Integer;
Sumber, Bantuan, Tujuan : Char;
Begin
Clrscr;
TextColor(Green); Write('Jumlah Piringan ?');
Readln(Jumlah);
TextColor(Green); Write('Waktu pemindahan (0-5) detik ?');
Readln(Waktu);
Clrscr;
GotoXY(25,24);Textcolor(2); Writeln(' Sumber Bantuan Tujuan ');
For I := Jumlah Downto 1 Do
Begin
Baris := 23 - (Jumlah - I);
GotoXY (30, Baris); Writeln(I);
End;
Langkah := 0;
Sumber := 'A';
Bantuan := 'B';
Tujuan := 'C';
Jumlah_A := Jumlah;
Jumlah_B := 0;
Jumlah_C := 0;
GotoXY(1,24); Writeln('Jumlah Langkah = ');
MenaraHanoi(Jumlah, Sumber,Tujuan,Bantuan,Langkah,Jumlah_A,Jumlah_B,Jumlah_C,Waktu);
Readln;
End.
0 komentar:
Posting Komentar