Hanoi双塔问题
来源:互联网 发布:网络论坛 编辑:程序博客网 时间:2024/05/01 12:26
Hanoi双塔问题
(hanoi.pas/c/cpp)
【问题描述】
给定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】
hanoi.in
hanoi.out
1
2
【输入输出样例2】
hanoi.in
hanoi.out
2
6
【限制】
对于50%的数据,1<=n<=25
对于100%的数据,1<=n<=200
【提示】
设法建立An与An-1的递推关系式。
-------------------------------------------------
如题目所说建立An与An-1的递推关系式
hanoi单塔递推公式f[n]:=2^n-1;
hanoi双塔递推公式f[n]:=(2^n-1)*2
---------------------------------------------------
后用高精乘单精就可以算出
注意细节,10的时候着么处理...
-------------------------------------------------
var n:longint; a:array[1..400]of longint;procedure init;begin assign(input,'p1069.in'); assign(output,'p1069.out'); reset(input); rewrite(output);end;procedure terminate;begin close(input); close(output); halt;end;procedure main;var i,j:longint; t:longint;begin readln(n); fillchar(a,sizeof(a),0); a[1]:=2; t:=1; for i:=1 to n do begin for j:=t downto 1 do begin a[j]:=a[j]*2; if a[j]>=10 then begin a[j+1]:=a[j+1]+a[j] div 10; a[j]:=a[j] mod 10; end; end; if a[t+1]>0 then inc(t); end; i:=1; dec(a[i],2); while a[i]<0 do begin a[i]:=a[i]+10; inc(i); dec(a[i]); end; if a[t]=0 then dec(t); for i:=t downto 1 do write(a[i]);end;begin init; main; terminate;end.
- Hanoi双塔问题(hanoi)
- Hanoi双塔问题
- Hanoi双塔问题
- Hanoi双塔问题
- 1485. Hanoi双塔问题
- 1485. Hanoi双塔问题
- P1354 Hanoi双塔问题
- 【数论 / 数值】【RQNOJ】Hanoi双塔问题
- 【递推】Hanoi双塔问题
- sicily 1485 Hanoi双塔问题
- Hanoi双塔问题 bjfu1120 递推
- Sicily 1485. Hanoi双塔问题
- vijos P1354 Hanoi双塔问题
- NEUQ 1419: Hanoi双塔问题
- [高精度][codevs 1145]Hanoi双塔问题
- 【9107】Hanoi双塔问题(NOIP2007)
- Vijos P1354 Hanoi双塔问题
- [NOIP2007] Hanoi双塔问题-解题报告
- 日语单词
- 动态规划入门(一) DP 基本思想 具体实现 经典题目
- 和创业者有关的五个迷思
- 可重入函数
- source insight调用Keil编译器
- Hanoi双塔问题
- Java基础上--(1)
- C++中的typedef
- Fedora15 显卡驱动程序的安装
- libxml2
- E - Frequent values
- 第七章:线程调度,优先级和关联性
- F - Billboard
- G - Apple Tree