雙色漢諾塔問題:圓盤最初是混合顏色的從小到大排好的,現在要求根據其顏色分開到兩個柱子上分別從小到大排好。三色漢諾塔問題可與此類似,分別是排到三個柱子上。
與漢諾塔問題類似,稍作一點改動,假設柱子的編號為ABC,共有n個圓盤(n為偶數)
1.將最上面的n-1個圓盤從A移動到B上面
2.將底部那個圓盤從A移動到C
3.將B柱上的n-2個圓盤移動到A上,從而形成了第二個圖那樣的情景
因此,可以根據一個遞歸的解法來解決此問題

~~~
//雙色漢諾塔問題
#include<iostream>
using namespace std;
int removeTimes = 0;
void hanoiorignal(int nmovnum, char czsource, char cztemp, char czdes)
{
if (nmovnum == 0)
{
return;
}
else if (nmovnum == 1)
{
cout<<"move the "<<nmovnum<<" disk from "<<czsource <<" to "<<czdes<<endl;
removeTimes++;
}
else
{
hanoiorignal(nmovnum -1, czsource, czdes, cztemp);
cout<<"move the "<<nmovnum<<" disk from "<<czsource <<" to "<<czdes<<endl;
removeTimes++;
hanoiorignal(nmovnum -2, cztemp, czdes, czsource);
}
}
void hanoitwocolor(int ndisk)
{
char szsource = 'a';
char sztemp = 'b';
char szdes = 'c';
for (int i = ndisk ; i > 0; i-= 2)
{
hanoiorignal(ndisk, szsource, sztemp, szdes);
}
cout<<"總共移動次數為:"<<removeTimes<<endl;
removeTimes = 0;
}
void main()
{
int ndisknum = 0;
cout<<"輸入塔上的盤碟數目,必須是2的倍數,輸入0結束"<<endl;
cin>>ndisknum;
while (ndisknum)
{
hanoitwocolor(ndisknum);
cout<<"輸入塔上的盤碟數目,必須是2的倍數,輸入0結束"<<endl;
cin>>ndisknum;
}
system("pause");
}
~~~
輸入共有6個圓盤,輸出結果如下:
