Hanio塔

漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
其實算法非常簡單,當盤子的個數爲n時,移動的次數應等於2^n – 1(有興趣的可以自己證明試試看)。後來一位美國學者發現一種出人意料的簡單方法,只要輪流進行兩步操作就可以了。首先把三根柱子按順序排成品字型,把所有的圓盤按從大到小的順序放在柱子A上,根據圓盤的數量確定柱子的排放順序:若n爲偶數,按順時針方向依次擺放 A B C;
  若n爲奇數,按順時針方向依次擺放 A C B。
  (1)按順時針方向把圓盤1從現在的柱子移動到下一根柱子,即當n爲偶數時,若圓盤1在柱子A,則把它移動到B;若圓盤1在柱子B,則把它移動到C;若圓盤1在柱子C,則把它移動到A。
  (2)接着,把另外兩根柱子上可以移動的圓盤移動到新的柱子上。即把非空柱子上的圓盤移動到空柱子上,當兩根柱子都非空時,移動較小的圓盤。這一步沒有明確規定移動哪個圓盤,你可能以爲會有多種可能性,其實不然,可實施的行動是唯一的。
  (3)反覆進行(1)(2)操作,最後就能按規定完成漢諾塔的移動。
  所以結果非常簡單,就是按照移動規則向一個方向移動金片:
  如3階漢諾塔的移動:A→C,A→B,C→B,A→C,B→A,B→C,A→C
我用的是遞歸,代碼如下:
#include"iostream.h"
void move(char e,char f);
void hanoi(int n,char a,char b,char c);
int main()
{
     int n;
     cout<<"請輸入圓盤的個數"<<endl;
     cin>>n;
     hanoi(n,'A','B','C');
     return 0;
}
void hanoi(int n,char a,char b,char c)
{
     if(n==1)
         move(a,c);
     else
        {
            hanoi(n-1,a,c,b);
            move(a,c);
            hanoi(n-1,b,a,c);
        }
}
void move(char e,char f)
{
     cout<<e<<"------>"<<f<<endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章