#include <stdio.h>
#define INF 1000000000
#define MAXN 500
#define MAXK (7*MAXN*MAXN+1)
#define MAXD (3*MAXN*MAXN)
#define NRDIR 8
int dl[NRDIR]=
{
-1, -1, 0, 1, 1, 1, 0, -1
};
int dc[NRDIR]=
{
0, 1, 1, 1, 0, -1, -1, -1
};
int k;
int q[MAXN+2][MAXN+2], ok[MAXN+1][MAXN+1], d[MAXN+1][MAXN+1], r[MAXK+1], x[MAXK+1], y[MAXK+1], l[MAXD+1], s[MAXD+1], urm[MAXK+1];
inline int myabs(int a){
if(a<0){
return -a;
}
return a;
}
inline void adauga(int a, int b, int c, int o){
k++;
r[k]=o;
x[k]=b;
y[k]=c;
d[b][c]=a;
if(l[a]==0){
l[a]=s[a]=k;
}else{
urm[s[a]]=k;
s[a]=k;
}
}
int main(){
int n, m, x1, y1, x2, y2, i, j, t;
FILE *fin, *fout;
fin=fopen("car.in", "r");
fout=fopen("car.out", "w");
fscanf(fin, "%d%d%d%d%d%d", &n, &m, &x1, &y1, &x2, &y2);
for(i=1; i<=n; i++){
for(j=1; j<=m; j++){
fscanf(fin, "%d", &q[i][j]);
d[i][j]=INF;
}
}
for(i=0; i<=n+1; i++){
q[i][0]=q[i][m+1]=1;
}
for(i=0; i<=m+1; i++){
q[0][i]=q[n+1][i]=1;
}
d[x1][y1]=0;
for(i=0; i<NRDIR; i++){
if(q[x1+dl[i]][y1+dc[i]]==0){
adauga(0, x1+dl[i], y1+dc[i], i);
}
}
t=0;
while((t<d[x2][y2])&&(t<=MAXD)){
while((t<=MAXD)&&(l[t]==0)){
t++;
}
if(t<=MAXD){
if(ok[x[l[t]]][y[l[t]]]==0){
ok[x[l[t]]][y[l[t]]]=1;
for(j=r[l[t]]-3; j<=r[l[t]]+3; j++){
i=(j+NRDIR)%NRDIR;
if((q[x[l[t]]+dl[i]][y[l[t]]+dc[i]]==0)&&(ok[x[l[t]]+dl[i]][y[l[t]]+dc[i]]==0)&&(d[x[l[t]]+dl[i]][y[l[t]]+dc[i]]>d[x[l[t]]][y[l[t]]]+myabs(r[l[t]]-j))){
adauga(d[x[l[t]]][y[l[t]]]+myabs(r[l[t]]-j), x[l[t]]+dl[i], y[l[t]]+dc[i], i);
}
}
}
l[t]=urm[l[t]];
}
}
if(d[x2][y2]==INF){
d[x2][y2]=-1;
}
fprintf(fout, "%d\n", d[x2][y2]);
fclose(fin);
fclose(fout);
return 0;
}