洛谷 P1443 马的遍历

题目大意:
有一个n*m的棋盘,在某个点上有一个马X,Y,要求你计算出马到达棋盘上任意一个点最少要走几步,输出一个n*m的矩阵,表示马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)。
1<=n,m,x,y<=400

题解:
bfs:
1.直接朝八个方向搜,如果搜过就退出,因为第一次搜的是最优解。
2.把答案转化成字符串然后按长度进行对齐, write(c,”:5-c);

const
     dx:array [1..8] of longint=(2,2,-2,-2,1,1,-1,-1);
     dy:array [1..8] of longint=(-1,1,-1,1,2,-2,2,-2);
var
     f:array [0..401,0..401] of longint;
     v:array [0..100001,1..2] of longint;
     n,m,p,q:longint;
     c:string;

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

procedure bfs;
var
     head,tail,i,j:longint;
begin
     for i:=1 to n do
         for j:=1 to m do f[i,j]:=maxlongint;
     f[p,q]:=0;
     head:=0;
     tail:=1;
     v[1,1]:=p;
     v[1,2]:=q;
     while headdo
               begin
                     inc(head);
                     for i:=1 to 8 do
                         if check(v[head,1]+dx[i],v[head,2]+dy[i]) then
                            begin
                                  inc(tail);
                                  v[tail,1]:=v[head,1]+dx[i];
                                  v[tail,2]:=v[head,2]+dy[i];
                                  f[v[tail,1],v[tail,2]]:=f[v[head,1],v[head,2]]+1;
                            end;
               end;
     for i:=1 to n do
         begin
              for j:=1 to m do
                  if f[i,j]=maxlongint then write('-1','':3)
                                       else begin str(f[i,j],c); write(c,'':5-length(c)); end;
              writeln;

         end;
end;

begin
     readln(n,m,p,q);
     bfs;
end.

你可能感兴趣的:(pascal,广搜bfs)