BFS(广搜) 最小转弯问题

SSL 2325
题目描述
给出一张地图,这张地图被分为 n×m(n,m<=100)个方块,任何一个方块不是平地就是高山。平地可以通过,高山则不能。现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能到达目的地(x2,y2)?你只能沿着水平和垂直方向的平地上行进,拐弯次数就等于行进方向的改变(从水平到垂直或从垂直到水平)的次数。例如:如图 1,最少的拐弯次数为5。
BFS(广搜) 最小转弯问题_第1张图片

题目分析
简化传统BFS,可以决定一个方向以后一路走到底,并将路上所有节点都输入数组,这样就可以达到“最优化问题”的解决方法了。哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

const
  dx:array[1..4]of longint=(1,-1,0,0);
  dy:array[1..4]of longint=(0,0,1,-1);
var
  n,m,b1,b2,e1,e2:longint;
  a:array[1..100,1..100]of longint;
  f:array[1..10000]of longint;
  s:array[1..10000,1..3]of longint;

procedure init;
var
  i,j:longint;
begin
  readln(n,m);
  for i:=1 to n do
   begin
     for j:=1 to m do
      read(a[i,j]);
     readln;
   end;
  readln(b1,b2,e1,e2);
end;

function ping(x,y:longint):boolean;
begin
  if (x<1)or(x>n)or(y<1)or(y>m)then exit(true);
  if a[x,y]=1 then exit(true);
  exit(false);
end;

procedure bfs;
var
  h,t,i,l:longint;
begin
  h:=0;t:=1;f[1]:=0;
  s[1,1]:=b1;s[1,2]:=b2;
  repeat
   inc(h);
   for i:=1 to 4 do
    if not ping(s[h,1]+dx[i],s[h,2]+dy[i]) then
     begin
       l:=h;
       while not ping(s[l,1]+dx[i],s[l,2]+dy[i]) do
        begin
          inc(t);
          s[t,1]:=s[l,1]+dx[i];
          s[t,2]:=s[l,2]+dy[i];
          s[t,3]:=s[h,3];
          a[s[t,1],s[t,2]]:=1;
          if (s[t,1]=e1)and(s[t,2]=e2)then
           begin
             writeln(s[t,3]);
             exit;
           end;
          l:=t;
          inc(s[t,3]);
        end;
     end;
  until h=t;
end;

begin
  init;
  bfs;
end.

你可能感兴趣的:(BFS(广搜) 最小转弯问题)