思路:
背景就不说了
假设汉诺塔有n层,起始时所有圆盘都在A柱,那么为了将所有的圆盘移动到C柱就需要将除最后一个之外的所有的圆盘移到B。
为了将除最后一个之外的所有的圆盘移到B,就需要将除最后两个个之外的所有的圆盘移到C
以此类推。
这篇文章只关注移动次数。
设存在数组N,N[i]的值是i层汉诺塔的移动次数。
非常容易知道N[i]=2*N[i-1]+1(i>1),如果不明白就请思考这句话:为了将所有的圆盘移动到C柱就需要将除最后一个之外的所有A移到B,之后再将所有圆盘移到C。
代码:
#include<iostream>
#include<stack>
#include<cmath>
using namespace std;
//假设汉诺塔有n层,那么为了将所有的圆盘移动到C柱就需要将除最后一个之外的所有的圆盘移到B
//为了将除最后一个之外的所有的圆盘移到B,就需要将除最后两个个之外的所有的圆盘移到C
//以此类推
//递归
int moves1(int layers)
{
if(layers==1) return 1;
else
{
return 2*moves1(layers-1)+1;
}
}
//栈 这道题用栈写非常没有意思
int moves2(int layers)
{
stack<int> S;
int ans=0;
for(layers;layers>1;layers--)
S.push(1);
ans=1;
while(!S.empty())
{
ans=2*ans+1;
S.pop();
}
return ans;
}
int main()
{
int layer;
cout<<"请输入汉诺塔的层数:"<<endl;
cin>>layer;
cout<<moves2(layer);
return 0;
}
我是怎么犯傻的:
聪明如我看到题立刻开始纠结了:它的位置以及中间的细节是什么??浪费了一个下午。