四柱汉诺塔

来源:互联网 发布:云警报警主机编程 编辑:程序博客网 时间:2024/06/16 00:50

问题;有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;}

此程序的缺点:数字太大的时候保存不了


0 0
原创粉丝点击