|
|
back to boardWhy WA? program p1060; const maxx=66000; type tnum=array [1..16] of shortint; rec=record map:tnum; dep,pre:longint; end; arr1=array [1..maxx] of rec; arr2=array [0..maxx] of boolean; var link:arr1; h:arr2; function ten(t:tnum):longint; var i:byte; x:longint; begin x:=0; for i:=1 to 16 do x:=x+trunc(exp((i-1)*ln(2)))*t[i]; ten:=x; end; function finish(t:tnum):boolean; var i:byte; begin for i:=1 to 16 do if (t[i]<>t[1]) then begin finish:=false; exit; end; finish:=true; end; procedure init; var i,j:byte; ch:char; begin for i:=1 to 4 do begin for j:=1 to 4 do begin read(ch); if (ch='w') then link[1].map[4*(i-1)+j]:=0 else link[1].map[4*(i-1)+j]:=1; end; readln; end; link[1].pre:=0; link[1].dep:=1; if finish(link[1].map) then begin writeln(0); readln; halt; end; fillchar(h,sizeof(h),false); end; procedure change(var t:tnum; i:byte); begin if (t[i]=1) then t[i]:=0 else t[i]:=1; end; procedure solve; var closed,open,w:LONGINT; t:tnum; i:byte; begin closed:=0; open:=1; repeat inc(closed); for i:=1 to 16 do begin t:=link[closed].map; change(t,i); if ((i-1) mod 4<>0) then change(t,i-1); if (i>4) then change(t,i-4); if (i<13) then change(t,i+4); if (i mod 4<>0) then change(t,i+1); w:=ten(t); if (not h[w]) then begin inc(open); h[w]:=true; link[open].map:=t; link[open].pre:=closed; link [open].dep:=closed+1; end; if finish(t) then begin writeln(link[closed].dep); readln; halt; end; end; until (closed>=open); end; begin init; solve; writeln('Impossible'); readln; end. |
|
|