poj1958Strange Towers of Hanoi 递推

题目

解出n个盘子4座塔的Hanoi(汉诺塔)问题最少需要多少步?直接输出1<=n<=12的答案

题解

对于n个盘子3座塔的汉诺塔问题,设d[n]表示解出n个盘子3座塔的最小步数,有d[n]=2*d[n-1]+1,即把前n-1个盘子从A柱移动到B柱(用了d[n-1]步),然后把第n个盘子从A柱移动到C柱(用了1步),最后把前n-1个盘子从B柱移动到C柱(用了d[n-1]步)。

对于4塔问题的解题思路类似。设f[n]表示求解n盘4塔问题的最小步数,有

f [ n ] = m i n 2 f [ i ] + d [ n i ] 1 <= i < n

即先把i个盘子在4塔模式下移动到B柱(用了f[i]步),然后把A柱上剩下的n-i个盘子在3塔模式下移动到D柱(用了d[n-i]步),最后把B柱上的i个盘子在4塔模式下移动到D柱(用了f[i]步)。枚举所有可能的i并取最小值可得出答案。

上述做法可推广到n盘m塔的计算

代码

#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

int d[15],f[15];

int main(){
    d[1]=1;
    for (int i=2;i<=12;i++)
        d[i]=2*d[i-1]+1;
    memset(f,0x3f,sizeof(f));
    f[1]=1;
    for (int i=2;i<=12;i++)
        for (int j=1;j<=i;j++)
            f[i]=min(f[i],2*f[j]+d[i-j]);
    for (int i=1;i<=12;i++)
        printf("%d\n",f[i]);
}

猜你喜欢

转载自blog.csdn.net/yjy_aii/article/details/81633805