虽然本题只是在原来的汉诺塔的基础上增加了一个柱子,但是不能根据先将上面的n-2个圆盘通过C和D移动到B上,然后再将第n-1个盘子移动到C上,接着讲最后一个圆盘移动到D上(假设D是最终的位置),最后将上面的n-2个圆盘通过A ,C移动到D上,所以一共需要F[n]=2*F[n-2] + 3步;当n<6时情况确实是这样的,但是当情况大于6时就不是这样的,更加详细的讲解请参考http://www.cnblogs.com/fanzhidongyzby/archive/2012/07/28/2613173.html ,我就不再这儿班门弄斧了。
C++代码:(因为事先知道n为64的时候数字不会很大,所以在做循环的时候作弊了一下,大数实在是不是太好搞)
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <limits.h>
using namespace std;
const long N =65;
long arr[N];
int main(){
arr[1] = 1;arr[2] = 3;
for(long i=3;i<N;i++){
long min=0x7fffffff;
for(long j = 1;j < i && j < 30;j ++){
long tmp = 2 * arr[i - j] + (1<<j) -1;
if(min > tmp)
min = tmp;
}
arr[i] = min;
}
int n;
while(scanf("%d",&n)!=EOF){
printf("%d\n",arr[n]);
}
return 0;
}
另外附上别人对汉诺塔相关问题的总结: http://blog.csdn.net/xueerfei008/article/details/9904681