题目概述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
解题思路
使用广搜,注意地图边界和马跳的方向即可。可以采用for代替8个if来减少要码的字。注意栈的读写。
时间复杂度:O(n*m)
空间复杂度:O(n*m)
源程序
const
d:array[1..2,1..8]of longint=((-2,-2,-1,-1,1,1,2,2),(1,-1,2,-2,2,-2,1,-1));
var
a:array[1..1002,1..1002]of longint;
b:array[1..250020,1..2]of longint;
n,m,x,y,i,j,top,tail:longint;
s:string;
begin
readln(n,m,x,y);
b[1,1]:=x;
b[1,2]:=y;
for i:=1 to n do
for j:=1 to m do
a[i,j]:=-1;
a[x,y]:=0;
top:=0;
tail:=1;
while top<tail do
begin
inc(top);
if top>250000 then top:=1;
for i:=1 to 8 do
if (b[top,1]+d[1,i]>=1)and(b[top,1]+d[1,i]<=n)
and(b[top,2]+d[2,i]>=1)and(b[top,2]+d[2,i]<=m)
and(a[b[top,1]+d[1,i],b[top,2]+d[2,i]]=-1)then
begin
inc(tail);
if tail>250000 then tail:=1;
b[tail,1]:=b[top,1]+d[1,i];
b[tail,2]:=b[top,2]+d[2,i];
a[b[tail,1],b[tail,2]]:=a[b[top,1],b[top,2]]+1;
end;
end;
for i:=1 to n do
begin
for j:=1 to m-1 do
begin
s:='';
str(a[i,j],s);
while length(s)<5 do
s:=s+' ';
write(s);
end;
writeln(a[i,m]);
end;
end.