四柱汉诺塔

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

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

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/qq_32126633/article/details/53284302
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞