基础的BFS题目,但是发现自己好久没有做过搜索题了,这道题做的很不爽,尤其是方向常量的处理,完全抄袭了他人的。
代码:
const nx:array[0..2,1..4] of integer=((1,-2,0,0),(1,-1,0,0),(0,0,-1,2)); ny:array[0..2,1..4] of integer=((0,0,1,-2),(0,0,-1,2),(1,-1,0,0)); ns:array[0..2,1..4] of integer=((2,2,1,1),(1,1,0,0),(2,2,0,0)); type ji=record x,y,s,w:longint; end; var q:array[0..2000000] of ji; a:array[0..511,0..511] of char; v:array[0..511,0..511,0..2] of boolean; n,m,s,t,head,tail,now,w,x,y,i,j,k:longint; nt:ji; vv:boolean; begin readln(n,m); while n<>0 do begin for i:=0 to n+1 do for j:=0 to m+1 do a[i,j]:='#'; vv:=false; t:=0; fillchar(v,sizeof(v),0); for i:=1 to n do begin for j:=1 to m do begin read(a[i,j]); if a[i,j]='O' then begin nt.x:=i; nt.y:=j; nt.s:=0; end else if a[i,j]='X' then begin if t=0 then begin q[1].x:=i; q[1].y:=j; q[1].s:=0; x:=i; y:=j; t:=1; v[x,y,0]:=true; now:=1; end else begin v[x,y,0]:=false; if i=x then now:=1 else now:=2; v[x,y,now]:=true; q[1].s:=now; end; end; end; readln; end; head:=1; tail:=1; q[1].w:=0; while head<=tail do begin x:=q[head].x; y:=q[head].y; now:=q[head].s; w:=q[head].w+1; for i:=1 to 4 do begin s:=q[head].x+nx[now,i]; t:=q[head].y+ny[now,i]; k:=ns[now,i]; if (s<1)or(t<1)or(s>n)or(t>m) then continue; if a[s,t]='#' then continue; if (k=0)and(a[s,t]='E') then continue; if (k=1)and(a[s,t+1]='#') then continue; if (k=2)and(a[s+1,t]='#') then continue; if v[s,t,k] then continue; v[s,t,k]:=true; inc(tail); q[tail].x:=s; q[tail].y:=t; q[tail].s:=k; q[tail].w:=w; if (q[tail].x=nt.x)and(q[tail].y=nt.y)and(k=0) then begin writeln(w); vv:=true; break; end; end; if vv then break; inc(head); end; if not vv then writeln('Impossible'); readln(n,m); end; end.