码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2019-09-03 23:59:02      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:ace   题意   问题   print   开始   多少   汉诺塔   表示   content   

链接:

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-奇怪的汉诺塔(递推)

标签:ace   题意   问题   print   开始   多少   汉诺塔   表示   content   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!