v:array[1..4] of longint=(1,-1,0,0);
var head,tail,i,j,n,x1,y1,x2,y2,x,y:longint;
a,f:array[1..1000,1..1000] of longint;
b:array[1..1000000,1..2] of longint;
c:char;
procedure search;
var j:longint;
begin
inc(head);
while head<=tail do
begin
x:=b[head,1]; y:=b[head,2];
for j:=1 to 4 do
if (x+u[j]>0) and (x+u[j]<=n) and (y+v[j]>0) and (y+v[j]<=n) then
if (f[x+u[j],y+v[j]]=0) and (a[x+u[j],y+u[j]]=0) then
begin
inc(tail);
b[tail,1]:=x+u[j];
b[tail,2]:=y+v[j];
f[x+u[j],y+v[j]]:=f[x,y]+1;
if (x+u[j]=x2) and (y+v[j]=y2) then
begin
writeln(f[x2,y2]);
exit;
end;
end;
inc(head);
end;
end;
begin
readln(n);
for i:=1 to n do
begin
for j:=1 to n do
begin
read(c);
a[i,j]:=ord(c)-48;
end;
readln;
end;
readln(x1,y1);
readln(x2,y2);
head:=0; tail:=0;
inc(tail); b[tail,1]:=x1; b[tail,2]:=y1;
a[x1,y1]:=1;
fillchar(f,sizeof(f),0);
search;
end.
#include<stdlib.h>
#include<string.h>
char s[1010][1010];
int a[1010][1010];
int next[5][2]={{0,0},{0,1},{1,0},{0,-1},{-1,0}};
struct note{
int x;
int y;
int s;
};
int book[1010][1010];
int head,tail,flag;
int tx,ty,p,q,sx,sy;
struct note que[1000*1000+10];
int main(){
int i,j,k,m,n;
scanf("%d",&n);
getchar();
for (i=1;i<=n;i++)
gets(s[i]);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
a[i][j]=s[i][j]-48;
scanf("%d%d%d%d",&sx,&sy,&p,&q);
tail=head=1;
que[tail].x=sx;
que[tail].y=sy;
que[tail].s=0;
tail++;
while (head<tail){
for (i=1;i<=4;i++){
tx=que[head].x+next[i][0];
ty=que[head].y+next[i][1];
if (tx<=0 || ty<=0 || tx>n || ty>n) continue;
if (book[tx][ty]==0 && a[tx][ty]==0){
book[tx][ty]=1;
que[tail].x=tx;
que[tail].y=ty;
que[tail].s=que[head].s+1;
tail++;
}
if (tx==p && ty==q){
flag=1;
break;
}
}
if (flag) break;
head++;
}
printf("%d\n",que[tail-1].s);
return 0;
}