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<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 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;
}