漢羅塔算法

漢羅塔問題:ios

有三個柱子A,B,C,在A中有n個從底部到頂部逐漸減少的盤子,如今要將A柱的盤子移動到C中去,而且在C中也是要從底部開始逐漸減少排列的。算法

這是個典型的經過遞歸來解決的問題,在使用遞歸算法時,this

咱們首先要找到anchor,在此例中,anchor就是:當n = 1時,也就是隻移動一個盤子時,那就是從A柱移動一個盤子到C盤去。若是是n個盤子呢?那咱們首先移動n-1個盤子到B柱去,而後再將A最後一個盤子移到C柱去,最後再將B柱的n-1個盤子移動到C柱去。spa

因此算法以下:code

#include <iostream>
#include <iomanip>

using namespace std;

void move(unsigned n, unsigned &moveNumber, char source, char destination, char spare)
{
    if (n == 1) {//anchor
        moveNumber++;
        cout << setw(3) << moveNumber <<".   move the top disk from " << source << " to " << destination << endl;
    }
    else {//移動n-1個盤子
    move(n-1, moveNumber, source, spare, destination);//先移動n-1個盤子到B
    move(1, moveNumber, source, destination, spare);//在將A最後的一個移動到C
    move(n-1, moveNumber, spare, destination, source);//再將B的n-1個盤子移動到C
    }
}

int main()
{
    const char PEG1 = 'A', PEG2 = 'B', PEG3 = 'C';
    unsigned moveNumber = 0;
    cout << "this programe solves the hanno tower puzzle.\n\n" << endl;
    cout << "enter the number of disk:" << endl;
    int numdisks;
    cin >> numdisks;

    move(numdisks, moveNumber, PEG1, PEG2, PEG3);//遞歸算法

    return 0;
}
相關文章
相關標籤/搜索