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

时间:2019-09-03
本文章向大家介绍Acwing-96-奇怪的汉诺塔(递推),主要包括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;
}

原文地址:https://www.cnblogs.com/YDDDD/p/11456472.html