مشکل:سورس برنامه ی هانوی

mhabat

Member
با سلام.سورس برج هانوی رو پیدا کردم حالا اگه میشه سورس رو برام توضیح بدید.
همچنین اگه میشه در اره ی خود برج هانوی هم اگه یک توضیح مختصر کنید ممنون میشم
سورس:
کد:
#include <iostream.h>
#include <stdio.h>
#include <conio.h>

void tower(int,char,char,char); /*prototype*/
int main()
{
    int ndisk;
    clrscr();
    cout<<"\n Enter number of disks <<<::: ";
    cin>>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)
    {
            cout<<"\n Disk 1 from "<<src<<" to "<<dest;
    }
    else
    {
        tower(topN-1,src,dest,aux); //src to aux
        cout<<"\n Disk "<<topN<<" from "<<src<<" to "<<dest;
        tower(topN-1,aux,src,dest); //aux to dest
    }
}
خیلی ممنون
بــــدرود
 

the_king

مدیرکل انجمن
با سلام.سورس برج هانوی رو پیدا کردم حالا اگه میشه سورس رو برام توضیح بدید.
همچنین اگه میشه در اره ی خود برج هانوی هم اگه یک توضیح مختصر کنید ممنون میشم
هانوی خیلی مساله ساده ای یه، چون مراحل اش خیلی ساده و تکراری یه، صرفا نباید فراموش کنید که قراره
چه کاری انجام دهید.

سه تا میله داریم که عمودی در زمین فرو رفته و یکسری دیسک سوراخ دار که اندازه شون متفاوته.
در ابتدای کار همه دیسک ها در یکی از میله ها بصورت مرتب از بزرگ به کوچک از پایین به بالا چیده شده اند.
دیسک ها با شماره مشخص شده اند، کوچکترین دیسک شماره اش 1 ئه.
مساله اینه که همه دیسک ها رو یکی یکی به میله دیگری انتقال بدهیم طوری که هیچ دیسکی روی دیسک
کوچکتر از خودش قرار نگیره. حق نداریم که در یک مرحله بیش از یک دیسک رو جابجا کنیم.

روال کار ساده است، یک الگوریتم بازگشتی رو آنقدر به مراحل کوچکتر شکسته و انجام می دهیم تا همه دیسک ها
به میله مقصد جابجا شده باشند. همیشه یک میله مبداء یعنی src است و یک میله مقصد یعنی dst و اون یکی میله کمکی یعنی aux خواهد بود.
در حین الگوریتم مدام جای میله های مبدا و مقصد و کمکی عوض می شوند.

الگوریتم "انتقال" : قراره n دیسک از بالای میله مبدا به مقصد منتقل بشه :
حالت a، اگر قرار صرفا یک دیسک از میله مبدا جابجا بشه، خیلی ساده به میله مقصد جابجاش می کنیم.
حالت b، وگرنه بجز دیسک شماره n ام n - 1 دیسک بالا تر میله مبدا رو طبق همین الگوریتم انتقال به میله کمکی
منتقل می کنیم. بعد اون دیسک پایینی که رویی هاش برداشته شده رو به مقصد منتقل می کنیم. بعد
اون دیسک هایی که به میله کمکی منتقل کرده بودیم رو طبق همین الگوریتم انتقال به میله مقصد منتقل می کنیم.

اصل مساله، ndisk (مثلا 6 دیسک) را منتقل کنید، A میله مبدا، B میله کمکی و C میله مقصد است :
کد:
tower(ndisk,'A','B','C');

حالت a، اگر فقط قراره یک دیسک منتقل بشه، خیلی ساده از میله مبدا به مقصد منتقل اش کنید :
کد:
    if(topN == 1)
    {
            cout<<"\n Disk 1 from "<<src<<" to "<<dest;
    }
    else

حالت b، وگرنه اول n - 1 دیسک بالاتر رو از مبدا به کمکی منتقل کنید :
کد:
    else
    {
        tower(topN-1,src,dest,aux); //src to aux

بعد دیسک پایینی رو به سادگی به مقصد منتقل کنید :
کد:
        cout<<"\n Disk "<<topN<<" from "<<src<<" to "<<dest;

و سپس اون n - 1 دیسک رو که به کمکی منتقل کرده بودید ببرید به مقصد :
کد:
        tower(topN-1,aux,src,dest); //aux to dest
    }
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا