مسئله برج هانوی به افسانه ای از هندوستان بازمی گردد. در یکی از معابد هندوستان سه ستون وجود داشته که در یکی 64 عدد حلقه به ترتیب قطرشان و جود داشته است. موبدان بر این باور بوده اند که هر گاه توانستند تمام این 64 حلقه را به به ستون سوم ببرند ، عمر جهان پیدا شده و دنیا به پایان خواهد رسید. بتا بر این موبدان دست به کار شدند و شروع به انتقال دادن حلقه ها کردند. البته در این انتقال باید:
1- در هر جابجایی تنها یک حلقه را جابجا کنند
2- حلقه بزرگتر روی کوچکتر قرار نگیرد.
این سوژه جالب موضوع بحث ریاضی دانان شد و بعد اهالی علم کامپیوتر به این فکر افتادند که این بازی را پیاده سازی کنند.
برج هانوی , معمایی است که از سه میله و N دیسک با اندازه های متفاوت . فرض شود که اگر دیسکی روی یک میله باشد , فقط دیسکی که قطر آن کوچکتر است می تواند بالای آن قرار گیرد مسئله چنین است که هر بار فقط یک دیسک انتقال یابد .
را حل : این مسئله با استفاده از یک الگوریتم باز گشتی حل می شود .
-اگر فقط یک دیسک باشد آنگاه آن را به میله مورد نظر انتقال می دهیم .
-اگر n > 1 باشد ; برای این کار n-1 دیسک بالای میله 1 را به میله 2 انتقال می دهیم . حالا دیسک پایینی میله 1 را ثابت باقی می ماند . حال دیسک باقیمانده در در میله 1 را به میله 3 منتقل میکنیم . سرانجام بار دیگر بصورت بازگشتی الگوریتم را فرا خانده تا n - 1 دیسک میله دو را به 3 منتقل کند .
اکنون موفق شدیم n دیسک را از میله 1 به 3 منقل کنیم .
در ++C
// hanoiTowers.cpp : main project file.
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
using namespace std;
void tower(int,char,char,char); /*prototype*/
int main()
{
int ndisk;
printf("\n Enter number of disks <<<::: ");
scanf("%d",&ndisk);
tower(ndisk,'A','B','C'); /*Calling Function*/
getch();
return 0;
} /* End of program */
/********************************************/
// src = Source | aux = Auxiliry | dest = Destination
void tower(int topN, char src,char aux,char dest)
{
if(topN == 1)
{
printf("\n Disk 1 from %c to %c ",src,dest);
}
else
{
tower(topN-1,src,dest,aux); //src to aux
printf("\n Disk %d from %c to %c ",topN,src,dest);
tower(topN-1,aux,src,dest); //aux to dest
} } |
Visual C++ 2010