Jumat, 24 Desember 2010

Teka-teki Menara Hanoi

            Pertama sekali saya mengenal teka-teki ini saat saya masih bersekolah di SMU. Pada saat itu guru matematika saya mengajukan teka-teki bagaimana memindahkan sejumlah piringan dari tongat pertama ke tongkat ketiga melalui tongkat kedua. Piringan tersebut harus berurutan sesuai dengan besarnya, jika tidak urut piringan yang lebih kecil akan pecah ditimpa oleh piringan yang lebih besar diatasnya. Singkatnya jumlah piringan di tongkat pertama harus dipindahkan ke tongkat ketiga sesuai dengan urutan piringan yang ada di tongkat pertama tadi. Masih segar dingatan saya, saya bisa menjawab pertanyaan guru saya tersebut langkah-langkah apa saja yang harus ditempuh untuk memindahkan piringan tersebut. Jumlah piring yang diberikan tidaklah terlalu banyak sehingga saya dengan mudah bisa menjawab dengan logika saya. 

            Memasuki perkuliahan ternyata saya dikenalkan kembali mengenai menara hanoi dimana saya dulu pernah mengenalnya. Perbedaannya sekarang saya dikenalkan dengan menara hanoi dengan cara berbeda dan media yang berbeda tetapi tetap dengan logika yang sama. Tiada lagi cara manual tetapi teka-teki menara hanoi di jawab melalui sebuah program dimana logika menara tersebut  dituangkan ke dalam sebuah program,  dalam hal ini program menggunakan bahasa Java. Dari program tersebut secara otomatis akan menguraikan langkah-langkah memindahkan piringan di tongkat pertama ke tongkat ke tiga melalui tongkat kedua dengan urutan piringan yang paling besar tetap selalu dibawah. Dari program ini juga akan didapat berapa langkah yang diperlukan untuk memindahkan piringan tersebut sesuai dengan jumlah piring. Secara matematika dapat di rumuskan untuk mendapatkan jumlah langkah yang didapat dari pemindahan tersebut yaitu : (2 pangkat n) -1, dimana n adalah jumlah piring yang akan dipindahkan. Contoh : jika jumlah piring berjumlah 3 maka langkah yang dibutuhkan adalah sebanyak 7 langkah. 

             Adapun program Menara Hanoi pada Java adalah sbb :

import java.io.*;
/**
 *
 */


public class MenaraHanoi {


    static int langkah = 0;
    static int totalPiringan = 0;


    public static void main(String[] arguments) throws java.io.IOException {
        int Piring;
        char dari = 'A';
        char bantuan = 'B';
        char akhir = 'C';
        Piring = Angka(" Masukkan jumlah piringan : ");
        totalPiringan = Piring;
        FileOutputStream f = new FileOutputStream("MenaraHanoi");
        Hanoi(Piring, dari, akhir, bantuan);
        System.out.println();
        System.out.println("Jumlah Langkah: " + langkah);
        }


    public static void Hanoi(int Piring, char dari, char akhir, char bantuan) {
        if (Piring >= 1) {
            Hanoi(Piring-1, dari, bantuan, akhir);
            pindahkanPiring(dari, akhir);
            Hanoi(Piring-1, bantuan, akhir, dari);
            }
        }
    public static void pindahkanPiring(char dari, char akhir) {
        langkah++;
        if(totalPiringan >=1){
            System.out.print("Pindahkan " + dari + " ke " + akhir + " ; ");
            if (langkah%5 == 0){
                System.out.println();
                }
            }
        }
   public static int Angka(String y) throws java.io.IOException {
        String x;
        int number = 0;
        BufferedReader in = new BufferedReader (new InputStreamReader(System.in));
        System.out.print(y);
        x = in.readLine();
        System.out.println();
        number = Integer.parseInt(x);
        return number;
        }
}

Selamat mencoba..

Tidak ada komentar:

Posting Komentar