如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。

URAL/1054

来自"NOCOW"

跳转到: 导航, 搜索

递归,假设目前状态有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.


个人工具