SSL 2278
题目描述
在你的帮助下,Oliver终于追到小X了,可有一天,坏人把小X抓走了。这正是Oliver英雄救美的时候。所以,Oliver又找到哆啦A梦,借了一个机器,机器显示出一幅方格地图,它告诉Oliver哪里能走,哪里不能走,。并且Oliver在这个地图的右下角,而小X在左上角。时间紧急,Oliver想知道,最少要走多少个格子,才能找到小X。(只能直走)。
题目分析
对于这道题,我只想说呵呵
跟这个:
http://blog.csdn.net/ssl_qyh0ice/article/details/53769339
几乎没两样,不过数据大点,分析就懒得写了。注意一下输入的时候就OK啦。
const
dx:array[1..4]of longint=(1,-1,0,0);
dy:array[1..4]of longint=(0,0,1,-1);
var
n,b1,b2,e1,e2,sum,l:longint;
a:array[1..100,1..100]of char;
f:array[1..10000]of longint;
s:array[1..100,1..2]of longint;
procedure init;
var
i,j:longint;
begin
readln(n);
for i:=1 to n do
begin
for j:=1 to n do
read(a[i,j]);
readln;
end;
readln(e1,e2,b1,b2);
end;
function ping(x,y:longint):boolean;
var
i:longint;
begin
if (x<1)or(x>n)or(y<1)or(y>n) then exit(false);
if a[x,y]='1' then exit(false);
exit(true);
end;
procedure print(n:longint);
begin
if n=0 then exit;
inc(sum);
print(f[n]);
end;
procedure bfs;
var
i,h,t:longint;
begin
h:=0;t:=1;s[1,1]:=b1;s[1,2]:=b2;
repeat
inc(h);
for i:=1 to 4 do
if ping(s[h,1]+dx[i],s[h,2]+dy[i]) then
begin
inc(t);
f[t]:=h;
s[t,1]:=s[h,1]+dx[i];
s[t,2]:=s[h,2]+dy[i];
a[s[t,1],s[t,2]]:='1';
if (s[t,1]=e1)and(s[t,2]=e2) then
begin
print(f[t]);
writeln(sum);
halt;
end;
end;
until h=t;
end;
begin
init;
bfs;
writeln(-1);
end.
P.S.最后那个writeln(-1);是随便加的,可要可不要。