时间限制: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;
}
}