CHESSCBG - Bàn cờ thế

Tác giả: flashmt

Ngôn ngữ: Pascal

const maxn=65535;
      r:array[1..4] of longint=(-4,1,4,-1);
var n,re,a,b:longint;
    d,q:array[0..maxn] of longint;
    p:array[1..16] of longint;

procedure rf;
var i,j:longint; c:char;
begin
     p[1]:=1;
     for i:=2 to 16 do p[i]:=p[i-1] shl 1;
     a:=0;
     for i:=0 to 3 do
     begin
          for j:=1 to 4 do
          begin
               read(c);
               if c='1' then a:=a or p[i*4+j];
          end;
          readln;
     end;
     b:=0;
     for i:=0 to 3 do
     begin
          for j:=1 to 4 do
          begin
               read(c);
               if c='1' then b:=b or p[i*4+j];
          end;
          readln;
     end;
end;

function outs(j,x:longint):boolean;
begin
     outs:=(x or p[j])<>x;
end;

function check(i,j:longint):boolean;
var x,y:longint;
begin
     check:=false;
     y:=i and 3;
     if y=0 then y:=4;
     x:=(i+3) shr 2;
     if (j=1) and (x=1) then exit;
     if (j=2) and (y=4) then exit;
     if (j=3) and (x=4) then exit;
     if (j=4) and (y=1) then exit;
     check:=true;
end;

procedure pr;
var i,j,num,k,t:longint;
begin
     q[1]:=a; i:=1; num:=1; d[a]:=1;
     repeat
           for j:=1 to 16 do
             if not outs(j,q[i]) then
               for k:=1 to 4 do
                 if check(j,k) and outs(j+r[k],q[i]) then
                 begin
                      t:=q[i] xor p[j] or p[j+r[k]];
                      if d[t]=0 then
                      begin
                           inc(num);
                           q[num]:=t;
                           d[t]:=d[q[i]]+1;
                      end;
                 end;
           inc(i);
     until d[b]>0;
     writeln(d[b]-1);
end;

begin
     rf;
     pr;

end.

Download