1096 双塔问题
时间:2022-08-27 03:30:00
1096 双塔问题
聘用的特长绝活
之前真的不明白这个问题。
现在我来试试
这个问题其实很简单,是递推,那么呢?
就这么的了
意思是A柱上的2n将B柱转移到C柱上
emmmmmmmmm
一个保证原则:大小顺序
我不明白这个问题和高精度有什么关系
无非就是一个递推
大意就是 用最少的次数将三个圆柱移到指定的C柱上,然后输出次数(最少)
首先,这个问题是递推和递归,因为移动方式与前项和后项有关,所以我们需要找出这种关系
第1步:将n-将两个圆盘移到B柱上
第二步:将两个最大的圆盘移到C柱上
第3步:将n-两个圆盘移到C柱上
因为第三步的步数=第一步和第二步需要两步
因此,总步数=第1步的步数*2 2
至于为什么n-这有点像步数问题,而不是步数问题n-3或更多,因为它有点类似于递推的边界,例如,我们经常得到它f[1]=1or这相当于为什么要设置f[1]而是别的
然后,我们必须有高精度
为什么要高精度? ,因为数量太大
#include #include #include #include #include #include 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 span class="token punctuation">(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;
}