1096 双塔问题

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;
 } 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值