编辑代码

/*
公式:F(n)[A(B)C] = F(n-1)[A(C))B] & F(1)[A(B)C] & F(n-1)[B(A)C]

所有n层,挪:A→C,相当于:
    把上面的n-1层,挪:A→B;
    把底下剩下的最大的1层,挪:A→C;
    把之前挪到B的n-1层,挪:B→C;
*/

#include <stdio.h>


int stepsum=0;      //计数器

void move(char ch1,char ch2,char ch3)   //移动:从1到3(借/跳过2)
{
    printf("%c -> %c\n",ch1,ch3);
    stepsum++;
}

void hannuota(int i,char ch1,char ch2,char ch3)  //总i层,从1到3(借2)
{
    if (i == 1)
        move(ch1,ch2,ch3);
    else
    {
        hannuota(i-1,ch1,ch3,ch2);      //i-1,从1到2(借3)
        hannuota(1,ch1,ch2,ch3);        //1,从1到3(借2)
        hannuota(i-1,ch2,ch1,ch3);      //i-1,从2到3(借1)
    }
}


int main()
{
    int i;
    
    printf("请输入汉诺塔层数:\n");
    scanf("%d",&i);
    hannuota(i,'A','B','C');
    printf("一共需要%d步!\n",stepsum);
    
    return 0;
}