最少转弯

【题目描述】
给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山。平地可以通过,高山则不能。现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能到达目的地(x2,y2)?你只能沿着水平和垂直方向的平地上行进,拐弯次数就等于行进方向的改变(从水平到垂直或从垂直到水平)的次数。
【输入格式】
第1行:n和m
第2至n+1行:整个地图地形描述,0为空地,1为高山
第n+2行:x1、y1、x2 、y2 ,分别为起点及终点坐标
【输出格式】
最少的拐弯次数
【样例输入】
5 7
1 0 0 0 0 1 0
0 0 1 0 1 0 0
0 0 0 0 1 0 1
0 1 1 0 0 0 0
0 0 0 0 1 1 0
1 3 1 7
【样例输出】
5
【分析】
广搜,每次向一个方向走,直到不能再走。

const
  dx:array[1..4]of longint=(0,0,-1,1);
    dy:array[1..4]of longint=(1,-1,0,0);
var
  map,book:array[0..101,0..101]of longint;
    qx,qy,qs:array[0..10001]of longint;
    i,j,n,m,x1,y1,x2,y2,head,tail,x,y:longint;
begin
  read(n,m);
    for i:=1 to n do
      for j:=1 to m do
          read(map[i,j]);
    read(x1,y1,x2,y2);
    head:=1;tail:=1;
    qx[1]:=x1; qy[1]:=y1; qs[1]:=0;
    fillchar(book,sizeof(book),0);
    book[x1,y1]:=1;
    while head<=tail do begin
        for i:=1 to 4 do begin
          x:=qx[head]+dx[i]; y:=qy[head]+dy[i];
            if (x=x2)and(y=y2) then begin
              write(qs[head]);
                exit;
            end;
            while (x>=1)and(x<=n)and(y>=1)and(y<=m)and(book[x,y]=0)and(map[x,y]=0) do begin
                inc(tail);
                qx[tail]:=x; qy[tail]:=y;
                qs[tail]:=qs[head]+1;
                book[x,y]:=1;
              x:=x+dx[i]; y:=y+dy[i];
            end;
        end;
      inc(head);
    end;
end.
posted @ 2016-08-29 09:42  JRX2015U43  阅读(148)  评论(0编辑  收藏  举报