大吉大利,今晚吃鸡

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
糖和抖m在玩个游戏,规定谁输了就要请谁吃顿大餐:抖m给糖a b c三个驻, 并在a柱上放置了数量为n的圆盘,圆盘的大小从上到下依次增大,现在要做的事就是把a柱的圆盘全部移到c柱,移动的过程中保持小盘在上,大盘在下,且限定圆盘只能够移动到相邻的柱子,即a柱子上的圆盘只能够移动到b,b柱子上的圆盘只能够移动到a或者c,c同理。现在请你设计一个程序,计算所需移动的最小步数, 帮助糖赢得大餐!

输入

1

输出

2

思路:汉诺塔问题换个样子,把汉诺塔搞搞清楚,明白每个移动的过程就ok了,剩下的事交给递归去做吧。
将n-1
过程分为五步:(可以拿n==2举例)
n-1个盘子从a到c
最下面的盘从a到b
n-1个盘从c到a
最下面的盘从b到c
n-1个盘从a到c

可以加点调试代码,输出每一步的具体移动步骤验证答案(调试代码未删

// 表达式计算
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

ll sum=0;


void han(int n,char a,char b,char c)//移动分为五步,n-1个盘子从a到c,最下面的盘从a到b,n-1个盘从c到a,最下面的盘从b到c,n-1个盘从a到c
{
    
    
    //边界
    if(n==1)
    {
    
    
    sum+=2;
//         printf("%c->%c\n",a,b);
//         printf("%c->%c\n",b,c);
         return;
    }
    han(n-1,a,b,c);

//    printf("%c->%c\n",a,b);
    sum++;


    han(n-1,c,b,a);

//    printf("%c->%c\n",b,c);
    sum++;

    han(n-1,a,b,c);
}
int main()
{
    
    

    char a='a',b='b',c='c';
    int n;
    while(cin>>n)
    {
    
    
    sum=0;
    han(n,a,b,c);
    cout<<sum<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/m0_53688600/article/details/113363494