31 October 2008

Solusi Puzzle Menara Hanoi Dengan Pemrogaman C


Konteks Menara Hanoi di sini adalah bukan menunjukkan nama suatu tempat, melainkan menunjukkan nama sebuah game puzzle yang sudah sering terdengar dalam telinga para gamers dan programmers. Kenapa Saya masukkan kata “programmers” ? Memang ini adalah sebuah games, tetapi penerapannya sering digunakan sebagai sebuah problem dalam bahasa pemrogaman.

Pada kali ini, Saya akan membagi ilmu kepada para pembaca sekalian tentang bagaimana problem ini dapat dipecahkan dengan bahasa pemrogaman. Bahasa pemrogaman yang akan Saya pakai adalah bahasa C. Pada pembahasan kali ini, kita akan memakai aplikasi fungsi rekursif yaitu fungsi yang memanggil dirinya sendiri.

Berikut adalah listing SC-nya.


#include <stdio.h>

#include <stdlib.h> //Header ini digunakan untuk mengambil fungsi atoi

#include <string.h> //Header ini digunakan untuk mengambil fungsi strlen

void tulisLangkah(int jmlCakram,char pasakAwal,char pasakAkhir,char pasakBantu)

// pindahkan piringan ke jmlPasak dari pasakAwal menuju pasakAkhir melalui pasakBantu

{

static int langkah=0; //Digunakan untuk penomoran setiap langkah

if (jmlCakram == 0) return;

/*1*/ tulisLangkah(jmlCakram-1,pasakAwal,pasakBantu,pasakAkhir);

//pindahkan piringan ke jmlPasak-1 dari pasakAwal menuju pasakBantu melalui pasakAkhir

/*2*/ printf("%4d. Pindahkan cakram ke %d dari pasak %c ke pasak %c\n",++langkah,jmlCakram,pasakAwal,pasakBantu);

/*3*/ tulisLangkah(jmlCakram-1,pasakAkhir,pasakAwal,pasakBantu);

//pindahkan piringan ke jmlPasak - 1 dari pasakAkhir menuju pasakAwal melalui pasakBantu

}

int main(int argc,char *argv[]) //Perintah untuk menuliskan argument pada Command Line

{

int jmlCakram,i;

if(argc==1)

{

printf("Maaf Anda harus menuliskan argumen pada command line !!!");

return 0;

}

jmlCakram = atoi(argv[1]);

//fungsi atoi didapat dari standar libarary stdlib yang fungsinya untuk mengconvert data string menjadi data integer

for(i=0;i

if(argv[1][i]-48<=0||argv[1][i]-48>9)

jmlCakram=0;

//Jika argumen yang dimasukkan mengandung integer dan string, maka akan ada informasi berupa peringatan

if(jmlCakram==0)

//jika argumen yang dimasukkan berupa string, maka fungsi atoi otomatis akan mengkonversi string menjadi 0

//sehingga apabila data yang dimasukkan berupa string, maka akan ada informasi yang akan muncul

{

printf("Argumen yang Anda masukkan salah !!!");

return 0;

}

if(jmlCakram>10)

{

printf("Argumen yang Anda masukkan terlalu besar !!!");

return 0;

}

printf("\n\n ***Menara Hanoi***\n\n");

printf("Untuk memindahkan %d cakram dari\npasak 1 ke 2, lakukan langkah-langkah ini:\n\n",jmlCakram);

tulisLangkah(jmlCakram,'1','3','2');

printf("\n\n ***Selesai***");

return 0;

}