汉诺塔最少需要三根柱子才能完成。移动次数是three[n]=2three[n-1]+1;
如果是四根柱子,移动次数肯定比用三根要少。
假设有n个盘子,我们实验如何移动次数最少,
1. 将 j个(0 到 n-1)个盘子移动到一个柱子,需要four[j]次
2. 其他盘子用三根柱子移动,需要three[n-j]次
3. 将之前j个盘子移动到结果,需要four[j]次
four[n] = (2*four[j]+three[n-j])
取所有j可能的最小four[n] = min{ four(n),2*four[j]+three[n-j])},(0<=j<=n-1)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int three[13];
//首先求出三根柱子下移动盘子要多少步
three[0]=0;
for(int i=1;i<=12;i++)
{
three[i]=three[i-1]+1+three[i-1];
}
int four[13];
memset(four,0x3f,sizeof(four));//不要忘记初始化
four[0]=0;
for(int i=1; i<=12;i++ )//盘子数量1-12
{
for(int j=0;j<i;j++)//实验开始
{
four[i]=min(four[i],four[j]*2+three[i-j]);
}
}
for(int i=1;i<=12;i++)
{
cout<<four[i]<<endl;
}
}