/*********************************************************************
程序思想:問題是把A柱上的所有盤子也是由上到下按從小到大移動到C柱上去,
中間有B柱可以做過渡,此程序用遞歸的思想去實現。
先假設A柱只有一個盤子,則可以將該盤從A直接移到C上,即A->C
假設有兩個盤子,則移動的次序爲A->B, A->C, B->C
假設有三個盤子,則移動的次序爲A->C,A->B,C->B, A->C,B->A,B->C,A->C
可以發現,不管盤子有多少我們的思想就是先把N個盤子上面的N-1個通過C先從A
移動到B
然後就把最大的盤子放到了C上了,此時A已空,我們把B上的所有盤子按照上面的
方法把最底下的
移到C上去,然後又把在A上的盤子再用上面的方法把最底下的移到C上去,如此遞
歸就可完成任務
***********************************************************************
*********************/
#include <iostream>
using namespace std;
typedef int PlateNum;//其實這裏沒這個必要呢,但是在大型的工程裏面這樣用
好點
void Move(char One,char Another)
//移動函數
{
cout<<"把"<<One<<"上的盤子移動到"<<Another<<"上"<<endl;
}
void Hanoi(PlateNum m,char A,char B,char C)
//漢諾塔有三個柱子A B C,有m個盤子,把A上的通過B全部移動到C上
{
if(1==m)
Move(A,C); //只有一個盤子的時候就直接把盤
子從A移到C
else //多於一個的話……
{
Hanoi(m-1,A,C,B); //先把m-1個盤子從A同過移動到B
Move(A,C); //此時A上只有一個最大的
了,那就把它移動到C上去
Hanoi(m-1,B,A,C); //此時B上有m-1個盤子,在用上面
的方法把B上的盤子全部移動到C上,依次類推
}
}
int main()
{
PlateNum m ;
cout<<"請輸入盤子的數目:";
cin>>m;
cout<<m<<"個盤子的漢諾塔的移動次序爲:"<<endl;
Hanoi(m,'A','B','C');
return 1;
}