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.