如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。
URAL/1054
来自"NOCOW"
< URAL
递归,假设目前状态有n个盘子: 1.当第n个盘子位于第1根柱子上,此时正在把n-1个盘子从1移到3。此时去掉第n个盘子,将第2、3根柱子交换,到达这一状态的步数等于到达原状态的步数 2.当第n个盘子位于第2根柱子上,此时正在把n-1个盘子从3移动到2。此时去掉第n个盘子,将第3、1根柱子交换,到达这一状态的步数+f[n-1]+1等于原步数 3.当第n个盘子位于第3根柱子上,此时必然无解,程序结束。
这是一道比较简单的题目
我们想要把第n个盘子从第一个柱子依到第3个柱子可以分成题目所述的三步,判断现在在那一步中,对应加上之前步数的值即可
program cao; const maxn=31; var p,data:array[0..maxn] of dword; from,tmp,target,now,a,b,c,d,e,f,g,h,i,j,k,l,n,m,q:longint; procedure swap(var a,b:longint); begin c:=a; a:=b; b:=c; end; begin read(n); for i:=1 to n do read(data[i]); for i:=0 to n-1 do p[i]:=(1 shl i)-1; from:=1; tmp:=3; target:=2; now:=0; for i:=n downto 1 do begin if data[i]=tmp then begin writeln(-1); halt; end; if data[i]=from then swap(tmp,target) else begin swap(from,tmp); inc(now,p[i-1]+1); end; end; writeln(now); end.
by cgangee http://www.cgang.tk
var i,j,k,m,n,l:longint; aa:array[1..50]of longint; ans:longint; procedure get(now,a,b,c:longint); begin if now=0 then exit; if aa[now]=a then get(now-1,a,c,b) else if aa[now]=b then begin inc(ans,1<<(now-1)); get(now-1,c,b,a); end else begin writeln(-1); halt; end; end; begin readln(n); for i:=1 to n do read(aa[i]); get(n,1,2,3); writeln(ans); end.