问题描述:求n阶汉诺塔,上数第k个盘子的移动次数
首先:由于比k小的盘子移动不会牵扯k移动,所以问题被简化成n-k+1阶汉诺塔中第一个盘子的移动次数。
再观察汉诺塔的移动策略:
1)将A上n-1个盘子借助C座线移到B座上;
2)把A座上剩下的一个盘移到C座上;
3)将n-1个盘从B座借助于A座移到C座上。
步骤2)中该盘子未移动,所以递推公式f[n]=2*f[n-1],
由于问题已经转化成n-k+1阶汉诺塔,故所求通项f[n]=2^(n-k).
#include<stdio.h>
int main() { long long f[61]; int i; for(i=1,f[0]=1;i<61;i++) { f[i]=f[i-1]<<1; } int n,x; while(scanf("%d%d",&n,&x)) { printf("%d\n",f[n-x]); } return 0; }
原文:http://www.cnblogs.com/zhen94/p/3551811.html