题目描述

给定A、B、C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形)。

现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存。要求:

(1)每次只能移动一个圆盘;

(2)A、B、C三根细柱上的圆盘都要保持上小下大的顺序;

任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。

输入输出格式

输入格式:

输入文件hanoi.in为一个正整数n,表示在A柱上放有2n个圆盘。

输出格式:

输出文件hanoi.out仅一行,包含一个正整数, 为完成上述任务所需的最少移动次数An。

输入输出样例

输入样例#1: 复制

【输入样例1】
1
【输入样例2】
2
输出样例#1: 复制

【输出样例1】
2
【输出样例2】
6

说明

【限制】

对于50%的数据,1<=n<=25

对于100%的数据,1<=n<=200

【提示】

设法建立An与An-1的递推关系式。

思路:

先找出An的通项公式,而两个相同的圆盘移动方法和一个圆盘的移动方法差不多,只要最后再乘二就好了,先考虑每种大小一个圆盘

而显然An=2*An-1+1,就相当于先把上面n-1个圆盘先挪走,再挪最大的,再把n-1个挪到它上面

又因为A1=1,因此有An=2^n-1,最后再乘二,An=2^(n+1)-2

写的话用高精度,算出2^(n+1),注意到2的幂的个位数字是2,4,8,6,所有再减二的时候不用考虑退位

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[];
int n,len,newl;
int main(){
scanf("%d",&n);
a[]=;len=;
for(int j=;j<=n;j++){
if(a[len]>=) newl=len+;
else newl=len;
for(int i=len;i>=;i--){
a[i]=*a[i];
if(a[i]>=){
a[i+]=a[i+]+;
a[i]=a[i]-;
}
}
len=newl;
}
a[]=a[]-;
for(int i=len;i>=;i--) printf("%d",a[i]);
return ;
}

最新文章

  1. Matlab 高脚杯模型切片
  2. WebGL与three.js
  3. ThinkPHP 下如何隐藏index.php
  4. 关于分布式事务的一个误解:使用了TransactionScope就一定会开启分布式事务吗?
  5. Jmeter—7 测试中使用到的定时器和逻辑控制器
  6. 503 Service Temporarily Unavailable
  7. 安装 Dubbo 管理控制台
  8. weka 文本分类(1)
  9. ToolBar+DrawerLayout + NavigationView
  10. cocos2d-x make: *** [clean-box2d_static-armeabi] Error 1
  11. 24-语言入门-24-cigarettes
  12. Activiti从当前任务任意回退至已审批任务
  13. javascript 中的nextSibling和previousSibling使用注意事项
  14. app图标icon大全
  15. 解析xml文件的四种方式
  16. RabbitMQ分布式集群架构和高可用性(HA)
  17. Python中的那些“坑”
  18. js获取地址栏传参
  19. Saltstack_使用指南03_配置管理
  20. Tomcat优化之容易集合经验

热门文章

  1. 监控RMAN操作进度的脚本
  2. Django综合基础知识
  3. Linux CentOs6.5误卸载自带python和yum后的解决办法
  4. 教你用webpack搭一个vue脚手架[超详细讲解和注释!]
  5. 笔记本win2008 r2的hyper-v安装centos
  6. 10个关于Android开发的实用教程
  7. POJ--1966--Cable TV Network【无向图顶点连通度】
  8. android:Activity启动模式之singleTask(一)
  9. dig linux下的使用
  10. pandas groupby 分组操作