简单双向广搜

题目大意:给你一个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.                     
posted @ 2012-10-14 19:23  neayo  阅读(231)  评论(0编辑  收藏  举报