閱讀600 返回首頁    go 阿裏雲 go 技術社區[雲棲]


糾結了好久才弄得明白一點點的漢諾塔問題,現在把一些方程與大家分享一下!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

謝謝各位的支持!下麵是我這兩天仔細研究的結果,希望大家看看有什麼不對!有的話,請提出你的意見,謝謝了!
這個程序是目的是:將A柱上的金盤移到B柱上

//從A到B

#include < iostream >

using namespace std;

void move(int inum, char from, char to);
void hanoi(int inum, char a, char b, char c);

void main()
{
int inum;

cout << "Please input the number of Gold Disk :" << endl;
cin >> inum;

cout << "當金盤數為"<< inum
<< "時將A上的金盤移動到B上的步驟為:"
<< endl;
hanoi(inum, 'A', 'B', 'C'); // 借助C,將A上的金盤移動到B上
}

void move(int inum, char from, char to)
{
cout << inum <<" :" << from << "移動到" << to << endl;
}

void hanoi(int inum, char a, char b, char c)
{
if (inum == 1) //每一次遞歸的終止條件
move(inum, a, b); //將第inum個金盤直接移動到B上
else
{
hanoi(inum-1, a, c, b); //將inum-1個金盤借助於B,從A移動到C上
move(inum, a, b); //將第inum個個金盤直接從A移動到B上
hanoi(inum-1, c, b, a); //將第inum-1個金盤借助於A,從C移到B上,就可以完成了目的
} //即從A上的金盤全部移到B上
}

 

 

以下隻分析inum = 3的情況:

 

當inum = 3 時:程序其實是:

hanoi(3, A,B,C)
{
   if(為1)
      move(1, A,B);     //將第inum個金盤直接移動到B上
   else
   {
      @1: hanoi(2,A,C,B);  //將inum-1個金盤借助於B,從A移動到C上
      @2: move(2,A,B);     //將第inum個個金盤直接從A移動到B上
      @3: hanoi(2,C,B,A);  //將第inum-1個金盤借助於A,從C移到B上,就可以完成了目的
   }
}

===>>>
@1: 先執行這個
hanoi(2, A,C,B)
{
   if(為1)
      move(1, A,C);   
   else
   {
       hanoi(1,A,B,C); 
       move(2,A,C);    
       hanoi(2,B,C,A); 
   }
}

hanoi(1, A,B,C)
{
   if(為1)
      move(1, A,B);           // 1:A移到B
   else
   {
      
     //這部分不用看了,,在此不修改了!
       
   }
}

 

===================================================================
@2:再執行這個:
move(2,A,C);                 //2:輸出A到C

@3:再執行這個:
hanoi(2,B,C,A);        //這裏就不一一列出來了,輸出結果應該是: 1:B移到C   3:A移動到B

最後就執行move:
        2:C移動到B    1:A移到B       

 

 

 

 

 

大家有什麼補充請補充一下,謝謝,互相學習學習!

 

 

 

最後更新:2017-04-02 06:51:39

  上一篇:go 2011年騰訊校園之星互聯網應用開發大賽之我見
  下一篇:go 該改變了