加载中...

信息奥赛题解|汉诺塔III


信息奥赛题解|汉诺塔III


🚀 题目浏览

【题目描述】

约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。

现在我们改变游戏的玩法,不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。

Daisy 已经做过原来的汉诺塔问题和汉诺塔II,但碰到这个问题时,她想了很久都不能解决,现在请你帮助她。现在有 $N$ 个圆盘,她至少多少次移动才能把这些圆盘从最左边移到最右边?

【输入】

多组数据,请处理到文件结束。

每组数据包含一个正整数 $N\ (1\le N\le 35)$.

【输出】

对于每组数据,在一行内输出移动最小的次数。

【输入样例】

1
3
12

【输出样例】

2
26
531440

【原题链接】

https://vjudge.net/problem/HDU-2064


☘️ 题解分析

汉诺塔问题升级版,但是递归/递推的本质没有发生变化。

🧑🏻‍💻 C++ 代码

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int N = 40;
LL f[N], n;

int main() {
    // 递推,预处理出所有答案
    f[1] = 2;
    for (int i = 2; i <= 35; i++) {
        f[i] = f[i - 1] * 3 + 2;
    }

    // 输出答案
    while (cin >> n) cout << f[n] << endl;

    return 0;
}

文章作者: Rickyの水果摊
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Rickyの水果摊 !
  目录