问题;有a,b,c,d四根柱子,要求最小的步数求出把a上的n根汉诺塔移到d上
解法:
1. 先把a上的的n个盘子分成两部分:(n-k)和k个,上层为k个
2. 把a上层的k个用四柱汉诺塔的方法借助c,d移动到b上
3. 把a剩下的n-k个盘用三柱汉诺塔的方法经过c移动到d上
4. 把b上的k个汉诺塔借助四柱汉诺塔的方式经过a,c移动到d上
由此可见要算n个盘子的四柱汉诺塔的步数等于min(k个盘子的四柱汉诺塔的步数+ k个盘子的四柱汉诺塔的步数+(n-k)个盘子的三柱汉诺塔的步数);
边界条件当n=1时四柱汉诺塔的步数为1;n=2的时候为3
在三柱汉诺塔的时候,最小的步数为2的(n-k)次方减1
此题用动态规划可以做出来;
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
int n;
while(~scanf("%d",&n)){
long long Min;
long long step[105];
int i,j;
step[1]=1;
step[2]=3;
long long m;
for(i=3;i<=n;i++){
Min=99999999999999999;
for(j=1;j<i;j++){
m=2*step[j]+(long long)pow(2,i-j)-1;
printf("%lld\n",m);
if(Min>m)
Min=m;
}
step[i]=Min;
//printf("%d\n",Min);
}
printf("%lld\n",step[n]);
}
return 0;
}
此程序的缺点:数字太大的时候保存不了