2007年分区联赛普级组之四 Hanoi双…

Description

  给定A,B,C三根足够长的细柱,在A柱上放有2n个中间有空的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形)。现要将 这些国盘移到C柱上,在移动过程中可放在B柱上暂存。要求: 
  (1)每次只能移动一个圆盘; 
  (2) A、B、C三根细柱上的圆盘都要保持上小下大的顺序; 
  任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。 

2007年分区联赛普级组之四 <wbr>Hanoi双塔问题

 

Input

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

Output

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

Sample Input

 

 
   

 

Sample Output

 

 
   

 

Hint

对于50%的数据, 1<=n<=25 
对于100% 数据, 1<=n<=200 
设法建立An与An-1的递推关系式。 



解题思路:先读入一个N,然后根据An=2*A(n-1)+1递推公式,用高精度乘单精度和高精度加单精度,最后输出时再用高精乘2即可。



程序:

const

  maxn=200;

var

  a:array[1..maxn]of longint;

  n:longint;


procedure init;

  begin

    readln(n);

    a[maxn]:=1;

end;


procedure mul;

  var

    s,g,i:longint;

  begin

    g:=0;

    for i:=maxn downto 1 do

      begin

        s:=a[i]*2+g;

        a[i]:=s mod 10;

        g:=s div 10;

      end;

end;


procedure add;

  var

    s,g,i:longint;

  begin

    g:=1;

    for i:=maxn downto 1 do

      begin

        s:=a[i]+g;

        a[i]:=s mod 10;

        g:=s div 10;

      end;

end;


procedure print;

  var

    i,j:longint;

  begin

    i:=1;

    while (a[i]=0) and (i

    for j:=i to maxn do

      write(a[j]);

end;


procedure work;

  var

    i:longint;

  begin

    for i:=2 to n do

      begin

        mul;

        add;

      end;

    mul;

end;


begin

  init;

  work;

  print;

end.



版权属于: Chris

原文地址: http://blog.sina.com.cn/s/blog_83ac6af80102v0i5.html

转载时必须以链接形式注明原始出处及本声明。

你可能感兴趣的:(NOIP分区联赛)