7-2 不一样的汉诺塔

文章介绍了如何通过递归策略和快速幂运算求解汉诺塔问题,给定盘子数量N,计算将所有盘子从A杆移动到C杆所需的最少步数。提供的C++代码展示了如何实现这一过程。
摘要由CSDN通过智能技术生成

7-2 不一样的汉诺塔

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置若干金盘(如下图)。

游戏的目标

把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。

操作规则

每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
在这里插入图片描述
事实上,汉诺塔游戏中的行动可以这样看待:当你需要移动某个盘子的时候,你需要先将它上面的全部盘子移动到无关杆上,再将这个盘子移动到目标杆,然后将它上面的盘子从无关杆移动到目标杆。从而,这一问题就可以通过递归的方式解决了。现在题目给出起始杆上按规律码放的盘子数量,请你给出将它们移动到目标杆上所需的最少步数。

输入格式:

一个正整数N(N<5000),代表你需要移动的的盘子数。

输出格式:

一个正整数,代表最少需要的步数。

输入样例:

70

输出样例:

1180591620717411303423

提示:如遇WA,请注意输入数据的范围。

ac代码

#include<iostream>
#define N 5000
using namespace std;

// 执行快速幂运算(2^n)的函数
void qpow(int *num) {
    int ans[N] = {0};
    // 将每个数字乘以2
    for (int i = 0; i < N; i++)
        ans[i] = num[i] * 2;
    // 处理进位
    for (int i = 0; i < N; i++)
        if (ans[i] >= 10) {
            ans[i + 1] += ans[i] / 10;
            ans[i] = ans[i] % 10;
        }
    // 用结果更新原始数组
    for (int i = 0; i < N; i++)
        num[i] = ans[i];
}

int main() {
    int n;
    cin >> n;
    // 用初始值2初始化数组
    int num[N] = {2};
    // 进行n次快速幂运算
    for (int i = 0; i < n - 1; i++)
        qpow(num);
    // 找到最高位的索引
    int i = N - 1;
    while (!num[i])
        i--;
    // 以相反的顺序打印结果
    for (; i > 0; i--)
        cout << num[i];
    cout << num[0] - 1;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值