1096 双塔问题
聘聘的拿手绝活
之前我是真的不明白这个题
现在我来试试
这个题其实很简单,就是一个递推,所以呢
就这么的了
意思就是将A柱上的2n个盘子中转B柱移动到C柱子上
emmmmmmmmm
保证的一个原则:大小顺序
我不明白的是,这个题和高精有啥关系
无非就是一个递推
大意就是 用最少的次数,把那三个圆柱给移到指定的C柱上,然后把次数输出(要最少的)
首先,这个题,是一个递推,递归,因为移动的方式都是和前一项后一项有关系,所以我们需要找出这个关系
第1步:将n-2个圆盘移到B柱上
第2步:将2个最大的圆盘移到C柱上
第3步:将n-2个圆盘移到C柱上
因为第3步的步数=第一步的步数且第2步需用2步
所以,总步数=第1步的步数*2+2
至于为什那么是n-2这就有点类似于步数问题,而不是n-3或者更多,因为这就有点类似于递推的边界,比如我们经常弄出f[1]=1or0,这就相当于为什么要设f[1]而是别的
然后,我们还得进行一个高精度
为什么要高精 ,因为数量太大
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
int l,n;//圆盘的个数以及方法数
int a[201],b[201];
using namespace std;
void gjc()
{
int t=0;//剩下的
for(int j=200;j>0;j--)
{
l=b[j]*2+t;//n等于2n的圆盘,所以乘二,然后加上剩余的
b[j]=l%10;//规律
t=l/10;
} //s递除,不然结果不变
} //求移动的过程
void gjj()
{
int t=0;
for (int j=200;j>0;j--)
{
l=a[j]+b[j]+t;
a[j]=l%10;
t=l/10;
}
}//同上
int main()
{
cin>>n;//输入圆盘数量
b[200]=1;//位数
for(int i=1;i<=n;i++)
{
gjc();//利用高精度将l 2n存入一下,我们以后进行移动圆盘
gjj();//移动圆盘 进行一个相加
}
int k=1;
while (a[k]==0&&k<200)//判断个数
k++;
for (int i=k;i<=200;i++)//模拟200次进行位数
printf("%d",a[i]);
return 0;
}