• 【NOIP2007】Hanoi双塔问题


    题目描述

    给定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.
    
    
    黎明的朝阳,会为苦难中最坚强的信念升起
  • 相关阅读:
    golang的time包
    golang的defer
    vscode出现卡在setting up workspace loading packages问题
    golang的module管理与使用go mod
    vscode常见插件及使用
    vscode的settings.json配置文件
    vscode的launch.json配置文件
    vscode搭建golang环境
    MacBook初使用
    Git-错误汇总
  • 原文地址:https://www.cnblogs.com/Dawn-Star/p/9675738.html
Copyright © 2020-2023  润新知