漢諾塔問題(Hanoi塔)

問題

有三個立柱A、B、C。A柱上穿有大小不等的圓盤N個,較大的圓盤在下,較小的圓盤在上。要求把A柱上的圓盤全部移到C柱上,保持大盤在下、小盤在上的規律(可藉助B柱)。每次移動只能把一個柱子最上面的圓盤移到另一個柱子的最上面。請輸出移動過程。

解答

這是動態規劃問題中的一種,用遞歸來實現較爲簡單方便。

對於“將moveSum個圓盤從from柱移動到to柱(藉助by柱)”這個問題,我們可以通過以下三步實現:

1. 將from柱最上面的moveSum-1個圓盤移動到by柱(藉助to柱)
2. 將from柱上剩下的那1個圓盤直接移動到to柱
3. 將by柱上的moveSum-1個圓盤移動到to柱(藉助from柱)

圖示

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

代碼

nclude <iostream>
using namespace std;

const int sumOfPlates = 4;// 總的盤子數目
int sum[3] = { sumOfPlates, 0, 0 };// 初始時各柱子上盤子數目
enum pillar{ A, B, C };// 三個柱子
char name[3] = { 'A', 'B', 'C' };// 對應的柱子名字

void move(int moveSum, pillar from, pillar by, pillar to);// 將moveSum個盤子從from柱移動到to柱(藉助by柱)

void main(){
    move(sumOfPlates, A, B, C);
}

void move(int moveSum, pillar from, pillar by, pillar to){
    if (moveSum == 0){
        return;
    }
    else{
        // 將from柱最上面的moveSum-1個圓盤移動到by柱(藉助to柱)
        move(moveSum - 1, from, to, by);
        // 將from柱上剩下的那1個圓盤直接移動到to柱
        cout << "move uppermost plate from " << name[from] << " to " << name[to] << endl;
        // 將by柱上的moveSum-1個圓盤移動到to柱(藉助from柱)
        move(moveSum - 1, by, from, to);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章