如果柱子標為ABC,要由A搬至C,在只有一個盤子時,就將它直接搬至C,當有兩個盤子,就將B當作輔助柱。如果盤數超過2個,將第三個以下的盤子遮起來,就很簡單了,每次處理兩個盤子,也就是:A->B、A ->C、B->C這三個步驟,而被遮住的部份,其實就是進入程式的遞回處理。事實上,若有n個盤子,則移動完畢所需之次數為2^n - 1。
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
// 使用RAND_MAX
void hanni(int n,char A,char B,char C)
{
if (n <0)
{
cout<<"n<0"<<endl;
exit(0);
}
else
{
if (1 == n)
{
printf("從%c移動%d個到%c",A,n,C);
cout<<endl;
}
else
{
hanni(n-1,A,C,B);
hanni(1,A,B,C);
hanni(n-1,B,A,C);
}
}
};
int main(){
char A = 'a';
char B = 'b';
char C = 'c';
hanni(3,A,B,C);
return 0;
}