【NOIP2007】Hanoi双塔问题
阅读原文时间:2023年07月11日阅读:1

题目描述

给定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.

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章