Senin, 12 Maret 2012

tower of hanoi

SEJARAH TOWER OF HANOI


Tower of Hanoi. Salah satu puzzle yang unik karena memiliki berbagai macam variasi yang membutuhkan penyelesaian yang berbeda untuk tiap variasinya.Tower of Hanoi ini memiliki asal mTeka-teki ini ditemukan Édouard Lucas ahli matematika Perancis di tahun 1883. Ada sebuah legenda tentang candi Indian yang berisi ruang besar dengan tiga tiang yang dikelilingi 64 cakram emas. Pendeta Brahma, melaksanakan tugas dari peramal di masa lalu, sesuai dengan aturan teka-teki ini. Menurut legenda ini, bila teka-teki ini diselesaikan, dunia akan kiamat. Tidak jelas benar apakah Lucas menemukan legenda ini atau terinspirasi olehnya.  Teka-teki ini cukup dikenal oleh para mahasiswa Ilmu Komputer karena sering muncul pada pengenalan struktur data dan algoritma.
Tujuan dari teka-teki ini adalah untuk memindahkan seluruh tumpukan ke tiang yang lain, mengikuti aturan berikut :
·         Hanya satu cakram yang boleh dipindahkan dalam satu waktu. 
·         Setiap perpindahan berupa pengambilan cakram teratas dari satu tiang dan memasukkannya ke tiang lain, di atas cakram lain yang mungkin sudah ada di tiang tersebut.
·         Tidak boleh meletakkan cakram di atas cakram lain yang lebih kecil. uasal yang unik karena berasalTower of Hanoi sering digunakan dalam riset psikologi dalam pemecahan masalah. Terdapat pula variasi dari Tower of Hanoi, yaitu Tower of London untuk diagnose neuropsikologi dan pengerjaan fungsi eksklusif. dari sebuah legenda di India.





Di program java Tower of Hanoi: contoh rekursif klasik, Mudah diselesaikan dengan rekursif
Dengan cara: Terdapat 3 menara (tower) dan beberapa cakram (disk) dengan ukuran berbeda, Disk atas harus lebih besar daripada disk bawah, Semua disk berawal dari tower pertama, Hanya 1 disk yang boleh dipindahkan dalam sekali waktu, Semua disk harus dipindahkan ke tower akhir


Berikut ini adalah contoh source code programnya dalam bahasa Java untuk menyelesaikan kasus tersebut. Dengan teknik rekursi, program menjadi lebih sederhana namun sangat powerfull untuk menyelesaikan permasalahan:

package menara_hanoi;
import javax.swing.JOptionPane;
/**
 *
 * @author COMPAQ
 */
public class Main {
    static int move = 1;

    public static void main(String[] args) {
        
        String input=JOptionPane.showInputDialog("masukkan jumlah piringan:");
        int n=Integer.parseInt(input);
        hanoi (n, 'A', 'B', 'C');}

static void hanoi (int n, char awal, char bantu, char tujuan){

if (n>=1) { hanoi (n-1, awal, tujuan, bantu);
move(n, awal, tujuan);
hanoi (n-1, bantu, awal, tujuan);}}




static void move (int n, char awal, char tujuan){
System.out.print("Langkah "+move+"\n");
move++;
System.out.print("Pindahkan piringan "+n);
System.out.print(" dari "+awal);
System.out.print(" ke "+tujuan+"\n");
    }

}

ada juga yang seperti ini

public class hanoi
{
public static void towers( int n, char from, char to, char aux)
{
if ( n == 1 ) {
System.out.println(“move disk 1 from “+from+” to “+to);
return;
}
towers( n – 1, from, aux, to );
System.out.println(“move disk “+n+” from “+from+” to “+to);
towers( n – 1, aux, to, from );
}
public static void main(String[] args) {
towers(3,’A',’C',’B');
}
}

ada juga yang seperti ini


/**
 * TowersOfHanoi.java
 * Created by Stijn Strickx on Aug. 12 2006
 * Copyright 2006 Stijn Strickx, All rights reserved
 */


import java.io.*;


public class TowersOfHanoi {


static int moves = 0;
static int totalDisks = 0;

public static void main(String[] arguments) throws java.io.IOException {
int disks;
char fromPole = 'A';
char withPole = 'B';
char toPole = 'C';
disks = getNumber("\nHow many disks are there on the tower? ");
totalDisks = disks;
if(totalDisks > 10){
System.out.println("Working...");
}
FileOutputStream fos = new FileOutputStream("TowersOfHanoiSolution.txt");
PrintStream ps = new PrintStream(fos);
solveHanoi(disks, fromPole, toPole, withPole, ps);
ps.close();
System.out.println();
System.out.println("\nAmount of moves: " + moves + "\n");
System.out.print("You can now access the TowersOfHanoiSolution.txt file");
System.out.println(" which is in the same directory as the .class file of this program.");
}

static void solveHanoi(int disks, char fromPole, char toPole, char withPole, PrintStream ps) {
if (disks >= 1) {
solveHanoi(disks-1, fromPole, withPole, toPole, ps);
moveDisk(fromPole, toPole, ps);
solveHanoi(disks-1, withPole, toPole, fromPole, ps);
}
}

static void moveDisk(char fromPole, char toPole, PrintStream ps) {
moves++;
if(totalDisks <= 10){
System.out.print("Move from " + fromPole + " to " + toPole + ". ");
ps.print("Move from " + fromPole + " to " + toPole + ". ");
if (moves%4 == 0){
System.out.println();
ps.println();
}
}
else {
ps.print("Move from " + fromPole + " to " + toPole + ". ");
if (moves%4 == 0){
ps.println();
}
}
}

static int getNumber(String question) throws java.io.IOException {
String theNumber;
int number = 0;
BufferedReader in = new BufferedReader (new InputStreamReader(System.in));
System.out.print(question);
theNumber = in.readLine();
System.out.println();
number = Integer.parseInt(theNumber);
return number;
}
}

2 komentar: