Acwing-96-奇怪的汉诺塔(递推)

Posted YDDDD

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Acwing-96-奇怪的汉诺塔(递推)相关的知识,希望对你有一定的参考价值。

链接:

https://www.acwing.com/problem/content/description/98/

题意:

汉诺塔问题,条件如下:

1、这里有A、B、C和D四座塔。

2、这里有n个圆盘,n的数量是恒定的。

3、每个圆盘的尺寸都不相同。

4、所有的圆盘在开始时都堆叠在塔A上,且圆盘尺寸从塔顶到塔底逐渐增大。

5、我们需要将所有的圆盘都从塔A转移到塔D上。

6、每次可以移动一个圆盘,当塔为空塔或者塔顶圆盘尺寸大于被移动圆盘时,可将圆盘移至这座塔上。

请你求出将所有圆盘从塔A移动到塔D,所需的最小移动次数是多少。

思路:

汉诺塔问题的递推式为D[i] = 2*D[i-1]+1.表示先用三个塔将n-1个盘子移到中间,在将一个盘子移到最后,在将n-1个盘子移到最后.
而四个柱子.可以先用四根柱子将j个盘子移到第二根,在将n-j个盘子移到最后一根,在通过四个柱子将j个盘子移到最后一个.

代码:

#include <bits/stdc++.h>
using namespace std;

int D[20];
int F[20];

int main()
{
    for (int i = 1;i <= 12;i++)
        D[i] = 2*D[i-1]+1;
    memset(F, 0x3f3f3f, sizeof(F));
    F[0] = 0;
    for (int i = 1;i <= 12;i++)
    {
        for (int j = 0;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]);

    return 0;
}

以上是关于Acwing-96-奇怪的汉诺塔(递推)的主要内容,如果未能解决你的问题,请参考以下文章

《算法竞赛进阶指南》-AcWing-96. 奇怪的汉诺塔-题解

AcWing - 96 - 奇怪的汉诺塔 = dp

96. 奇怪的汉诺塔递推

奇怪的汉诺塔

汉诺塔VII(递推,模拟)

HDU1207 汉诺塔II(递推)