洛谷 P1443 马的遍历
2017-04-06 16:42
309 查看
题目大意:
有一个n*m的棋盘,在某个点上有一个马X,Y,要求你计算出马到达棋盘上任意一个点最少要走几步,输出一个n*m的矩阵,表示马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)。
1<=n,m,x,y<=400
题解:
bfs:
1.直接朝八个方向搜,如果搜过就退出,因为第一次搜的是最优解。
2.把答案转化成字符串然后按长度进行对齐, write(c,”:5-c);
有一个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< 4000 /span> (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 head<tail do 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.
相关文章推荐