問題描述:
已知 n ( n 是偶數)個盤子,大小相同的盤子有兩個,疊放在一起,但下面的盤子是紅色,上面的盤子是藍色。
條件:
- 每次只能移動一個盤子
- 大盤子不能放在小盤子上面
- 在移動的過程中不能出現兩個大小相同的盤子疊在一起,且下面的盤子是藍色而上面的盤子是紅色的情況。
. . . 表示紅盤
- - - 表示藍盤
= = = 表示底座

分析:
注意條件3中 大小相同,上紅下藍 是 先與后非 的關系,兩個同時滿足才成立。
故這個雙色Hanoi塔問題 等價於 從上到下,從小到大依次排列的Hanoi塔問題,運用遞歸算法。
(注:Hanoi塔問題中,當n等於奇數時,第一個(n=1)盤子第一步肯定落在目標柱上;當n等於偶數時,肯定落在過渡柱上)
備注:
- 編程語言:c++
- 編譯器:Code::Blocks 16.01
- 操作系統:windows 10
源代碼:
//雙色漢諾塔問題
/*測試數據:
6
6
(n為奇數時,是藍盤;n為偶數時,是紅盤)
(輸出一行為一步,(n=6)共需63步)
*/
(輸出一行為一步,(n=6)共需63步)
*/
#include<iostream>
using namespace std;
void Hanoi(int n,char a,char b,char c)
{
if(n>0)
{
Hanoi(n-1,a,c,b); //將n-1個盤子從A柱移到B柱,C作為過渡柱
cout << n << a << "->" << c << endl; //將A柱上剩下的一個直接移到C柱
Hanoi(n-1,b,a,c); //將n-1個盤子從B柱移到C柱,A作為過渡柱
}
}
{
if(n>0)
{
Hanoi(n-1,a,c,b); //將n-1個盤子從A柱移到B柱,C作為過渡柱
cout << n << a << "->" << c << endl; //將A柱上剩下的一個直接移到C柱
Hanoi(n-1,b,a,c); //將n-1個盤子從B柱移到C柱,A作為過渡柱
}
}
int main()
{
int n;
char a = 'A',b = 'B',c = 'C';
cout<<"Input a number of disk:";
cin>>n;
Hanoi(n,a,b,c);
return 0;
}
{
int n;
char a = 'A',b = 'B',c = 'C';
cout<<"Input a number of disk:";
cin>>n;
Hanoi(n,a,b,c);
return 0;
}
運行界面:
