汉诺塔问题 C++ 代码实现

题目描述

给定 A 、 B 、 C 三根足够长的细柱,在 A 柱上放有 2n 个中间有孔的圆盘,共有 n 个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的,现要将这些圆盘移到 C 柱上,在移动过程中可放在 B 柱上暂存。要求:

  1. 每次只能移动一个圆盘;
  2. A 、 B 、 C 三根细柱上的圆盘都要保持上小下大的顺序;

设 A_n 为 2n 个圆盘完成上述任务所需的最少移动次数,对于输入的 n,输出 A_n 。

输入格式

一个正整数 n,表示在 A 柱上放有 2n 个圆盘。

输出格式

一个正整数, 为完成上述任务所需的最少移动次数 A_n 。

解题思路

汉诺塔问题是经典的递归问题,我们可以将将 n 个圆盘从 A 移到 C 分为以下三个步骤:

  1. 将 n - 1 个圆盘从 A 移到 B,可借助 C 暂存;
  2. 将编号为 n 的圆盘从 A 移到 C;
  3. 将 n - 1 个圆盘从 B 移到 C,可借助 A 暂存。

然后递归处理子问题即可。

具体实现细节见代码。

时间复杂度

每个圆盘最多被移动一次,总共需要移动 2^n - 1 次,因此时间复杂度为 O(2^n)。

C++ 代码

#include <iostream>
using namespace std;

int hanoi(int n, char A, char B, char C) {
    if (n == 1) {
        cout << "Move disk 1 from " << A << " to " << C << endl;
        return 1;
    } else {
        int count = hanoi(n - 1, A, C, B);
        cout << "Move disk " << n << " from " << A << " to " << C << endl;
        count += hanoi(n - 1, B, A, C) + 1;
        return count;
    }
}

int main() {
    int n;
    cin >> n;
    cout << "Total steps: " << hanoi(n, 'A', 'B', 'C') << endl;
    return 0;
}
汉诺塔问题 C++ 代码实现

原文地址: https://www.cveoy.top/t/topic/ocBn 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录