标题党一下,其实应该叫【计算思维作业】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;
}