Ads 468x60px

  • Jumat, 02 Desember 2011

    menara hanoi pascal


    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.


    0 komentar:

    Posting Komentar