【NOIP2007】Hanoi双塔问题
2024-09-02 07:12:53
题目描述
给定A、B、C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形)。
现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存。要求:
(1)每次只能移动一个圆盘;
(2)A、B、C三根细柱上的圆盘都要保持上小下大的顺序;
任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。
分析
思路简单一点,汉诺双塔=汉诺塔×2,OK,那么就是求两倍的汉诺塔,思路是一样的。
我们做一个比较简单的递推,要把2N个盘从A移动到B上,就先移动2(N-1)个到C上,在移2个到B上。
再把2(N-1)个移到B上,因此F(N)=2*F(N-1)+2
F(1)=2,易得F(N)=2^(N+1)-2
又因为N最大到200,2的201次方太大了,因此需要使用高精度。
AC代码
var
a:array[1..100] of integer;
n,i,j:integer;
begin
fillchar(a,sizeof(a),0);
readln(n);
a[1]:=1;
for i:=1 to n+1 do
begin
for j:=1 to 100 do a[j]:=a[j]*2;
for j:=2 to 100 do
begin
a[j]:=a[j]+a[j-1] div 10;
a[j-1]:=a[j-1] mod 10;
end;
end;
j:=100;
while a[j]=0 do dec(j);
a[1]:=a[1]-2;
for i:=j downto 1 do write(a[i]);
end.
最新文章
- ReportView报表开发记录(一)
- spring 3.1 配置 JCR 303 Bean Validation
- ios 区域检测 使用coreLocation
- mysql导入sql文件
- ajax练习习题二三级联动
- Moebius实现Sqlserver集群~介绍篇
- REST和JAX-RS相关知识介绍
- 轻松搞定Linux端口转发
- hi3531 SDK 编译 uboot, 修改PHY地址, 修改 uboot 参数 .
- android分包方案
- C语言中 sscanf 的用法
- Python之路【第七篇】:Python装饰器
- weblogic patch log显示
- SpringBoot 启动概述
- Vue 组件化
- np.linespace使用方法
- 转:fastText原理及实践(达观数据王江)
- 如何更改myecelipse、eclipse的Project Explorer的背景颜色
- 学习node js 之微信公众帐号接口开发 准备工作之三
- Apache Ant和Apache Maven的区别