简单双向广搜

题目大意:给你一个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.                     

转载于:https://www.cnblogs.com/neayo/archive/2012/10/14/2723247.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值