简单双向广搜
题目大意:给你一个n*m的矩阵,0代表路,1代表墙,给出起点和中点,求最短距离。
双向广搜的一个显著特点即是知道初始状态和目标状态,虽然说这道题可能还体现不出双向广搜的优势……
具体方法可以望文生义,就是要加一个标记记录这个状态是从起点还是从终点转过来的。
1 program Neayo; 2 const 3 inf='maze.in'; 4 ouf='maze.out'; 5 f:array[1..4,1..2]of longint=((0,-1),(-1,0),(1,0),(0,1)); 6 var 7 i,j,k,n,m:longint; 8 qx,qy:array[0..4000000]of longint; 9 a,q:array[0..2001,0..2001]of longint; 10 procedure init; 11 begin 12 assign(input,inf);assign(output,ouf); 13 reset(input);rewrite(output); 14 readln(n,m); 15 fillchar(a,sizeof(a),$ff); 16 for i:=1 to n do 17 begin 18 for j:=1 to m do 19 begin 20 read(a[i,j]); 21 if a[i,j]=1 then a[i,j]:=-1; 22 end; 23 readln; 24 end; 25 readln(qx[1],qy[1],qx[2],qy[2]); 26 close(input); 27 end; 28 procedure go; 29 var top,closed,x,y,xx,yy:longint; 30 begin 31 top:=0;closed:=2; 32 q[qx[1],qy[1]]:=1;q[qx[2],qy[2]]:=0; 33 a[qx[2],qy[2]]:=1; 34 repeat 35 inc(top); 36 x:=qx[top];y:=qy[top]; 37 for i:=1 to 4 do 38 if a[x+f[i,1],y+f[i,2]]<>-1 then 39 begin 40 xx:=x+f[i,1];yy:=y+f[i,2]; 41 if ((a[xx,yy]<>0)or((xx=qx[1])and(yy=qy[1])))and(q[xx,yy]<>q[x,y]) then 42 begin 43 writeln(a[x,y]+a[xx,yy]); 44 exit; 45 end; 46 if (a[xx,yy]=0)and((xx<>qx[1])or(yy<>qy[1])) then 47 begin 48 inc(closed); 49 qx[closed]:=xx; 50 qy[closed]:=yy; 51 a[xx,yy]:=a[x,y]+1; 52 q[xx,yy]:=q[x,y]; 53 end; 54 end; 55 56 until(top>=closed); 57 writeln('No Answer!'); 58 end; 59 begin 60 init; 61 go; 62 close(output); 63 end.