我觉得这是道挺繁琐的广搜,没啥难度,但不太爱写……累死……但如果单就练习BFS来说还是挺适合热热身的… program Bloxorz_I; const deltax:array[0..2,1..4] of longint= ((1,-2,0,0),(1,-1,0,0),(0,0,-1,2)); deltay:array[0..2,1..4] of longint= ((0,0,1,-2),(0,0,-1,2),(1,-1,0,0)); deltas:array[0..2,1..4] of longint= ((2,2,1,1),(1,1,0,0),(2,2,0,0)); type rec=record x,y,s,dep:longint; end; var data:array[0..550,0..550] of longint; que:array[1..2000000] of rec; vis:array[0..550,0..550,0..2] of boolean; n,m,i,j,k,tot,r,d,open,closed:longint; flag:boolean; ch:char; aim:rec; function check(x,y,s:longint):boolean; begin if (x<1) or (x>n) or (y<1) or (y>m) then exit(false); if data[x,y]=0 then exit(false); if (s=0) and (data[x,y]=1) then exit(false); if (s=1) and (data[x,y+1]=0) then exit(false); if (s=2) and (data[x+1,y]=0) then exit(false); if vis[x,y,s] then exit(false); exit(true); end; function ok(a,b:rec):boolean; begin if a.x<>b.x then exit(false); if a.y<>b.y then exit(false); if a.s<>b.s then exit(false); exit(true); end; begin assign(input,'a.in'); reset(input); assign(output,'a.out'); rewrite(output); readln(n,m); while n<>0 do begin tot:=0; fillchar(vis,sizeof(vis),0); for i:=1 to n do begin for j:=1 to m do begin read(ch); case ch of '#': data[i,j]:=0; 'E': data[i,j]:=1; '.': data[i,j]:=2; 'O': begin data[i,j]:=2; with aim do begin x:=i; y:=j; s:=0; end; end; 'X': begin data[i,j]:=2; inc(tot); if tot=1 then begin open:=0; closed:=1; with que[1] do begin x:=i; y:=j; s:=0; dep:=0; end; vis[i,j,0]:=true; end else with que[1] do begin if x=i then s:=1 else s:=2; vis[x,y,0]:=false; vis[x,y,s]:=true; end; end; end; end; readln; end; flag:=false; while (not flag) and (open<closed) do begin inc(open); d:=que[open].dep+1; with que[open] do for k:=1 to 4 do begin i:=x+deltax[s,k]; j:=y+deltay[s,k]; r:=deltas[s,k]; if check(i,j,r) then begin inc(closed); vis[i,j,r]:=true; with que[closed] do begin x:=i; y:=j; s:=r; dep:=d; end; if ok(que[closed],aim) then begin writeln(d); flag:=true; break; end; end; end; end; if not flag then writeln('Impossible'); readln(n,m); end; close(input); close(output); end.