给定A、B、C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形)。现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存。要求:
(1)每次只能移动一个圆盘;
(2)A、B、C三根细柱上的圆盘都要保持上小下大的顺序;
任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。
分析:这题一开始没有太多的头绪,后来变手算结果发现前三个结果为2,2+4=6,2+4+8=14,于是猜测了递推式,为正解。
const maxn=500; var a:array[0..maxn,0..maxn] of int64; n,j,i:longint; t:int64; procedure mu1; var g,i,b:longint; s:int64; begin g:=0; b:=2; for i:=maxn downto 1 do begin s:=a[i,j-1]*b+g; a[i,j]:=s mod 10; g:=s div 10; end; end; procedure add; var i:longint; begin a[maxn,j]:=a[maxn,j]+2; for i:=maxn downto 1 do begin a[i-1,j]:=a[i-1,j]+a[i,j] div 10; a[i,j]:=a[i,j] mod 10; end; end; begin fillchar(a,sizeof(a),0); readln(n); j:=0; while j<n do begin inc(j); mu1; add; end; i:=1; while a[i,n]=0 do inc(i); for j:=i to maxn do write(a[j,n]); end.