奇怪汉诺塔
解析
先考虑三座塔的递推式:
d(1)=1,d(n)=2d(n-1)+1(n>=2)或d(n)=2n-1
这一个为人所知,那么四座呢?
我们设f(n)代表四座塔i个盘最少步数,得
f(n)=min(2f(i)+d(n-i))(0<=j<n)
证明:
考虑从A柱移动j个盘到B柱上,为f(j),再移动(n-j)个盘到D柱上,为d(n-j),最后从B柱移动j个到D柱,为f(j),得
f(n)=min(2f(i)+d(n-i))(0<=j<n)
code:
#include<cstdio>
using namespace std;
int d[13]={0,1},f[13]={0,1};
int Min(int x,int y){return (x<y)?x:y;}
int main()
{
for(int i=2;i<=12;i++)d[i]=d[i-1]*2+1;
//d[i]=2^i-1
printf("1");
for(int i=2;i<=12;i++)
{
f[i]=0x7f7f7f7f;
for(int j=1;j<=i;j++)f[i]=Min(f[i],2*f[j]+d[i-j]);//公式
printf("\n%d",f[i]);
}
return 0;
}