بررسي مسئله :برج هانوي

شروع موضوع توسط aira ‏14 نوامبر 2005 در انجمن برنامه‌نویسی C و هم خانواده‌هایش

  1. aira

    aira Member

    ارسال‌ها:
    219
    تشکر شده:
    71
    امتیاز دستاورد:
    16
    سلام من برنامه برج هانوي رو نوشتم ميخواستم بدونم درسته يا نه؟؟
    کد (Text):
     #include <stdio.h>
    maim()
    {
    void transfer(int,char,char,char);
    int n;
    printf("how many disks?");
    scanf("%d",&n); /*disks*/
    printf("\n");
    transfer(n,`L`,`R`,`C`); /*L=Left,R=Right,C=Center*/
    }
    void transfer(int n,char from,fromchar to,char temp)
    {
    if (n>0) {
    transfer(n-1,from,temp,to);
    printf("move disk %d from %c to %c\n",n,from,to);
    transfer(n-1,temp,to,from);
    }
    return 0;
    }
     
    نوشته شده توسط aira در ‏14 نوامبر 2005
  2. stranger_in_rain

    stranger_in_rain Member

    ارسال‌ها:
    183
    تشکر شده:
    27
    امتیاز دستاورد:
    16
    به نظرم کد شما تنها یکی از حلقه ها را جابه جا میکند!
     
    نوشته شده توسط stranger_in_rain در ‏15 نوامبر 2005
  3. aira

    aira Member

    ارسال‌ها:
    219
    تشکر شده:
    71
    امتیاز دستاورد:
    16
    نيازمند ياري سبزتان هستم

    ميتونيد يه ذره راهنماييم كنيد تا بتونم برنامشو بنويسم
    باc++هم اينجوري نوشتم اين چطوره؛اگه ميتونيد راهنماييم كنيد تا برنامشو بنويسم::wink:
    کد (Text):
    void Hanoi(int x,int h, int d)
    {
    if(x==1)
    cout<<"move disk from"<<s<<"to"<<d;
    else{
    Hanoi(x-1,s,d,h);
    cout<<"move disk from"<<s<<"to"<<d;
    Hanoi(x-1,h,s,d);
    ‌‌
    }
     
    توضيح:
    s:ميله اول
    h=ميله دوم به عنوان ميله كمكي
    d=ميله سوم به عنوان ميله مقصد
     
    نوشته شده توسط aira در ‏15 نوامبر 2005
  4. stranger_in_rain

    stranger_in_rain Member

    ارسال‌ها:
    183
    تشکر شده:
    27
    امتیاز دستاورد:
    16
    کمی یاری قرمز ;)

    سلام.

    ببخشید یه ذره دیر میشه پاسخ های من. 2 مسئله در این جریان دخیل هستش ، سرم خیلی شلوغه !!!! و می ایستم ببینم کسی جواب میده یا نه ... :(

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

    H(n)=(2^n)-1

    ولی خوب مسئله به این سادگی هم نیست چون این طور که شما نوشتید برنامه رو، همه ی حلقه ها یکسان فرض شده، در حالی که حلقه ها size های گوناگون دارند. پس به این سادگی هم نیست ;)

    من هنوز رو این مسئله فکر نکردم اما با این نکته هر دو فکر کنیم و حلش کنیم.
     
    نوشته شده توسط stranger_in_rain در ‏22 نوامبر 2005
  5. aira

    aira Member

    ارسال‌ها:
    219
    تشکر شده:
    71
    امتیاز دستاورد:
    16
    ولي تا اونجايي كه به ما گفتن اين مسئله سه حلقه يكسان داره .
    الگوريتمي كه من نوشتم از يك حاقه به عنوان كمك استفاده كرده و ديسك ها رو بع صورت n-1جابجا ميكنه.
    جوابشو بزود ميزارم
     
    نوشته شده توسط aira در ‏23 نوامبر 2005
  6. stranger_in_rain

    stranger_in_rain Member

    ارسال‌ها:
    183
    تشکر شده:
    27
    امتیاز دستاورد:
    16
    سلام

    در مسئله ی کلی هانوی حلقه ها از بزرگ به کوچک روی هم چیده میشوند.
    به طوری که بزرگترین زیر همه و کوچکترین روی همه قرار دارد ... و هیچ حلقه ی بزرگتری نمیتواند روی حلقه ی کوچک تر از خود قرار بگیرد ...

    به این عکس نگاه کنید :

    http://www.cs.brandeis.edu/~obaby/cs11a/functions/hanoi.gif
     
    آخرین ویرایش: ‏23 نوامبر 2005
    نوشته شده توسط stranger_in_rain در ‏23 نوامبر 2005
  7. aira

    aira Member

    ارسال‌ها:
    219
    تشکر شده:
    71
    امتیاز دستاورد:
    16
    بله.اصلاً خود مسئله به همين صورت هست.اينم جوابش:D
    کد (Text):

    #include <iostream>
    #include <cstdlib>
    #include <conio.h>
    #include <cmath>

    typedef char* Peg;
    void move(Peg A, Peg B);
    void transfer(size_t N, Peg A, Peg B, Peg C);
    void get_disk_num(int &iNum);


    int main()
    {
        while(1)
        {
            std::cout << "\t\t\tHanoi Towers Puzzle Solver" << std::endl << std::endl;
            std::cout << "Enter number of disc on the first peg (enter -1 to quit): ";
            int iDiskNum, iStepNum;
            get_disk_num(iDiskNum);
            if(iDiskNum == -1)
            {
                std::cout << "hope you enjoyed using these program!" << std::endl;
                break;
            }
            else
            {
                iStepNum = pow(2, iDiskNum) - 1;
                std::cout << "the shortest solution can be reach in " << iStepNum << " steps" << std::endl;
                std::cout << "press any key to show the solution...";
                getch();
                std::cout << std::endl;
                transfer(iDiskNum, "Peg1", "Peg2", "Peg3");
                system("pause");
                system("cls");
            }
        }
        return 0;
    }

    // tedade jabejayi diskha
    void move(Peg A, Peg B)
    {
        std::cout << "move top most disc from " << A << " to " << B << std::endl;
    }

    // chegonegiye harekate diskhara namayesh midahad
    void transfer(size_t N, Peg A, Peg B, Peg C)
    {
        if(N > 0)
        {
            // enteghale avalin N - 1 disk be "B"
            transfer(N - 1, A, C, B);
           
            // enteghale akharin disk be "C"
            move(A, C);
           
            // enteghale dickhaye "B" be"C",
            transfer(N - 1, B, A, C);
        }
    }

    void get_disk_num(int &iNum)
    {
        std::cin >> iNum;
        if(iNum != -1 && iNum < 1)
        {
            std::cout << "please notice that the number of disc needs to be an integer bigger than 0" << std::endl;
            std::cout << "number of disc on the first peg: ";
            get_disk_num(iNum);
        }
    }

     
    بروبچ بياين كپي كنيد حالشو ببريد.يه دعايي هم براي بنده بخونيد
     
    آخرین ویرایش: ‏23 نوامبر 2005
    نوشته شده توسط aira در ‏23 نوامبر 2005
    sweet و hami110 از این پست تشکر کرده اند.
  8. J4vad

    J4vad Member

    ارسال‌ها:
    736
    تشکر شده:
    249
    امتیاز دستاورد:
    16
    دوست عزيز برنامه مشكل داره اصلا اجرا نمي شه ؟!!!
     
    آخرین ویرایش: ‏24 نوامبر 2006
    نوشته شده توسط J4vad در ‏24 نوامبر 2006
  9. maryam1385

    maryam1385 New Member

    ارسال‌ها:
    1
    تشکر شده:
    0
    امتیاز دستاورد:
    1
    برج هانوي
     
    نوشته شده توسط maryam1385 در ‏14 اکتبر 2007

به اشتراک بگذارید