雙色Hanoi塔問題
題目如下
Description
設A、B、C是3 個塔座。開始時,在塔座A 上有一疊共n 個圓盤,這些圓盤自下而上,由大到小地疊在一起。
各圓盤從小到大編號為1,2,……,n,奇數號圓盤著藍色,偶數號圓盤著紅色。現要求將塔座A 上的這一疊
圓盤移到塔座B 上,並仍按同樣順序疊置。在移動圓盤時應遵守以下移動規則:
規則(1):每次只能移動1 個圓盤;
規則(2):任何時刻都不允許將較大的圓盤壓在較小的圓盤之上;
規則(3):任何時刻都不允許將同色圓盤疊在一起;
規則(4):在滿足移動規則(1)-(3)的前提下,可將圓盤移至A,B,C 中任一塔座上。
試設計一個演算法,用最少的移動次數將塔座A 上的n個圓盤移到塔座B 上,並仍按同樣順序疊置。
對於給定的正整數n,程式設計計算最優移動方案。
Input
包含多組測試資料,每組測試資料包含一個正整數n。
Output
每組測試資料包含多行。每一行描述一步一定方案。
每一行由一個正整數k和2個字元c1和c2組成,表示將第k個圓盤從塔座c1移到塔座c2上。
各資料之間用一個空格隔開。
Sample Input
3
Sample Output
1 A B
2 A C
1 B C
3 A B
1 C A
2 C B
1 A B
其實基本思想就是遞迴
//ACcode
#include <stdio.h>
#include <string.h>
void mov(int n,char x,char y)
{
printf("%d %c %c
",n,x,y);
}
void hanoi(int n,char A,char B,char C)
{
//n ---個數;
//A---源柱;
//B--暫用柱;
//C--目標柱;
if(n==1)//遞迴邊界
mov(n,A,C);
//公式呼叫
else{
hanoi(n-1,A,C,B);
mov(n,A,C);
hanoi(n-1,B,A,C);
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
hanoi(n,`A`,`C`,`B`);
}
return 0;
}
這樣就可以解決這個問題啦!mua~~