SSL 2325
题目描述
给出一张地图,这张地图被分为 n×m(n,m<=100)个方块,任何一个方块不是平地就是高山。平地可以通过,高山则不能。现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能到达目的地(x2,y2)?你只能沿着水平和垂直方向的平地上行进,拐弯次数就等于行进方向的改变(从水平到垂直或从垂直到水平)的次数。例如:如图 1,最少的拐弯次数为5。
题目分析
简化传统BFS,可以决定一个方向以后一路走到底,并将路上所有节点都输入数组,这样就可以达到“最优化问题”的解决方法了。哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
const
dx:array[1..4]of longint=(1,-1,0,0);
dy:array[1..4]of longint=(0,0,1,-1);
var
n,m,b1,b2,e1,e2:longint;
a:array[1..100,1..100]of longint;
f:array[1..10000]of longint;
s:array[1..10000,1..3]of longint;
procedure init;
var
i,j:longint;
begin
readln(n,m);
for i:=1 to n do
begin
for j:=1 to m do
read(a[i,j]);
readln;
end;
readln(b1,b2,e1,e2);
end;
function ping(x,y:longint):boolean;
begin
if (x<1)or(x>n)or(y<1)or(y>m)then exit(true);
if a[x,y]=1 then exit(true);
exit(false);
end;
procedure bfs;
var
h,t,i,l:longint;
begin
h:=0;t:=1;f[1]:=0;
s[1,1]:=b1;s[1,2]:=b2;
repeat
inc(h);
for i:=1 to 4 do
if not ping(s[h,1]+dx[i],s[h,2]+dy[i]) then
begin
l:=h;
while not ping(s[l,1]+dx[i],s[l,2]+dy[i]) do
begin
inc(t);
s[t,1]:=s[l,1]+dx[i];
s[t,2]:=s[l,2]+dy[i];
s[t,3]:=s[h,3];
a[s[t,1],s[t,2]]:=1;
if (s[t,1]=e1)and(s[t,2]=e2)then
begin
writeln(s[t,3]);
exit;
end;
l:=t;
inc(s[t,3]);
end;
end;
until h=t;
end;
begin
init;
bfs;
end.