您的位置:首页 > 其它

洛谷 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);

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: