當前位置: 首頁>>算法&結構>>正文


漢諾塔(hanoi)遞歸實現的圖示化(原創)

Hanoi Tower,也叫漢諾塔、河內之塔、漢羅塔等,是如下圖(來自百度圖片)所示的一個遊戲:

 
 
 
 
 
 
 
  

要求將塔A的盤全部移到C,移動過程中不能將大盤放到小盤的上麵。
Hanoi Tower的遞歸算法實現思想為(假設盤數為N)
1)當A隻有一個盤時(即N = 1),直接將盤移動到C
2)當A中有兩個或者兩個以上的盤時(即N >=2),
先遞歸地將N-1個盤從塔A移到輔助塔B,
再將剩下的一個盤從塔A移到塔C
最後遞歸地將N-1個盤從塔B移到塔C
遞歸實現的核心代碼如下:

hanoi_move( int n, int x, int y, int z )
{

    if( n==1 )
        printf( "%c-->%c\n", x, z );//從X移到Z
    else
    {
        hanoi_move( n-1, x, z, y);//n-1個盤從X移到Y,Z為輔助

        printf( "%c-->%c\n", x, z );//1個盤從x移到Z

        hanoi_move( n-1, y, x, z );//n-1個盤從Y移到Z,X為輔助
    }
}

 
上麵的代碼雖然簡單,但是遞歸的過程並不容易理解,本文旨在於將遞歸過程的每一步移動用簡單圖形的方式
展現出來。以下是在VC++ 6.0 編譯器中實現的可圖示化Hanoi Tower的執行過程的源代碼(C++)

#include 
#include 
using namespace std;

//hanoi tower
vector A; //Tower A
vector B;//Tower B
vector C; //Tower C
int N; //The number of plates

//initialize the towers=====================================
void init()
{
    cout<<"init..............................."<= 1; --i)
        A.push_back(i);
    B.clear();
    C.clear();
}

//print towers using characters=============================
void print_char(int n, char ch)
{
    int i;
    for(i = 0; i < n; ++i)
        cout<= 0; --i)
    {
        if(i < A.size())
            print_plate(A[i]);
        else
            print_empty();
        cout<<"  ";

        if(i < B.size())
            print_plate(B[i]);
        else
            print_empty();
        cout<<"  ";

        if(i < C.size())
            print_plate(C[i]);
        else
            print_empty();

        cout<& x, vector& y)
{
    cout<<"move..............................."<& a, vector& b, vector& c)
{
    if(n == 1)
    {
        move(a, c);
    }
    else
    {
        hanoi(n - 1, a, c, b);//moving the n-1 plates from a to b
        move(a, c); //move a plate from a to c
        hanoi(n - 1, b, a, c);//moving the n-1 plates from b to c
    }
}

//main =============================================================
int main()
{

    N = 4;
    init();
    print_tower();
    hanoi(N, A, B, C);
    system("pause");
    return 0;
}

運行結果如下(由於運行結果較長,下麵有兩張圖片一起展示運行結果):
33  

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/162.html,未經允許,請勿轉載。