s:array[1..4,1..2]of integer=((0,1),(0,-1),(-1,0),(1,0));
var
p,c:array[1..2000,1..2000] of 0..1;
f:array[1..4000000,1..2] of integer;
d:array[1..4000000]of longint;
x,y,x1,y1,x2,y2,i,j,n:integer;
st,e:longint;
ch:string;
begin
//////////////////////////////////////////读
readln(n);
for i:=1 to n do begin
readln(ch);
for j:=1 to n do val(ch[j],p[i,j]);
end;
fillword(c,sizeof(c),0);
st:=1;
e:=1;
readln(x1,y1);
readln(x2,y2);
f[1,1]:=x1;
f[1,2]:=y1;
d[1]:=0;
c[x1,y1]:=1;
//////////////////////////////////////////搜
repeat
for i:=1 to 4 do begin
x:=f[st,1]+s[i,1];
y:=f[st,2]+s[i,2];
if (x>0)and(y>0)and(x<=n)and(y<=n) then begin
if (p[x,y]<>1) and (c[x,y]<>1) then begin
e:=e+1;
f[e,1]:=x;
f[e,2]:=y;
d[e]:=d[st]+1;
c[x,y]:=1;
if (x=x2)and(y=y2) then begin
writeln(d[e]);
halt;
end;
end;
end;
end;
st:=st+1;
until st>e;
end.
f 是广搜队列
c 是判重
st 当前
e 新节点位置(末节点)
p 地图