雙色Hanoi塔問題

Maosghoul發表於2019-05-13

雙色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~~

相關文章