一看就懂的图解汉诺塔及其变形!

标题党一下,其实应该叫【计算思维作业】A.汉诺塔变形版

题目

时间限制 1000 ms
内存限制 64 MB

题目描述

有ABC三根杆和一些圆盘,开始的时候圆盘从小到大摞在A杆上,小盘在上大盘在下,规定如果圆盘p摞在圆盘q上面,那么rp<=rq,rp和rq为p和q的半径。
现在有若干个圆盘,半径从1到n,半径为i的圆盘有i个,每次操作可以移动一个圆盘,问把所有圆盘从A杆移动到C杆上最少需要几次操作。 由于最终答案可能很大,所以答案对1e9+7取模输出。

输入数据

一个正整数n,n<=1e5

输出数据

最少操作次数

样例输入
2
样例输出
4
样例说明

第一步把半径为1的圆盘从A放到B 第二步和第三步把两个半径为2的圆盘从A放到C 第四步把半径为1的圆盘从B放到C

注意

这个问题是汉诺塔的变体

“半径为i的圆盘有i个”,是与原版汉诺塔问题不同的地方。

思路图解(变形版)

所以加入了“半径为i的圆盘有i个”的条件后,变化体现在(2),对半径为i的圆盘的操作次数是i次,而不是原版的1次了。

代码

#include<iostream>
using namespace std;
#define len 100010
long long int hanoi[len]={0};
int main()
{
    int n;
    cin>>n;
    hanoi[1]=1;
    for(long long int i=2;i<=n;i++)
    {
        hanoi[i]=(hanoi[i-1]*2+i)%(long long int)(1e9+7);
    }
    cout<<hanoi[n]<<endl;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值