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;
}