题目:
思路:
总的来说,和有汉诺塔的原题差不多,只要在此基础上*2即可
所以先考虑汉诺塔原题该如何解决
1.将n-1个盘子通过C然后放置到B上
2.再将最大的盘子放到C
3.将n-2个盘子通过C放置到A上
4.第二大的放到C
。。。。。
TLE做法:
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
const int maxn=111111;
int n;
int ans;
void move(int n,char a,char b,char c)
{
if(n==1)
{
ans++;
//cout<<a<<"->"<<c<<endl;
}
else
{
move(n-1,a,c,b);
//cout<<a<<"->"<<c<<endl;
ans++;
move(n-1,b,a,c);
}
}
int main()
{
cin>>n;
move(n,'a','b','c');
cout<<2*ans<<endl;
return 0;
}
AC代码:
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
const int maxn=111111;
int n;
long long f[maxn];
int main()
{
cin>>n;
f[1]=1;
for(int i=2;i<=n;i++)
{
f[i]=2*f[i-1]+1;
}
cout<<2*f[n]<<endl;
return 0;
}