#include <bits/stdc++.h>
using namespace std;
ifstream fin("car.in");
ofstream fout("car.out");
int sx,sy,k,fx,fy,n,m,dp[505][505][10],i,j,dx[10]={0,-1,-1,-1,0,1,1,1,0},dy[10]={0,-1,0,1,1,1,0,-1,-1};
bool a[505][505];
const int INF=(1<<30);
int getdist(int dir1, int dir2)
{
return min(abs(dir1-dir2),8-abs(dir1-dir2));
}
bool in(int x, int y)
{
return (x>=1&&x<=n&&y>=1&&y<=m&&!a[x][y]);
}
struct nod{
int x,y,dir;
};
deque<nod> q;
int alg()
{
fin>>n>>m>>sx>>sy>>fx>>fy;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
fin>>a[i][j];
for(k=1;k<=8;k++)
dp[i][j][k]=INF;
}
for(i=1;i<=8;i++)
{
dp[sx][sy][i]=0;
int nx=sx+dx[i];
int ny=sy+dy[i];
if(in(nx,ny))
{
q.push_front({nx,ny,i});
dp[nx][ny][i]=0;
}
}
while(!q.empty())
{
nod fr=q.front();
q.pop_front();
int x=fr.x;
int y=fr.y;
int dir=fr.dir;
if(x==fx&&y==fy)
return dp[x][y][dir];
int dir1=dir+1;
int dir2=dir-1;
if(dir1==9)dir1=1;
if(dir2==0)dir2=8;
int xx=x+dx[dir];
int yy=y+dy[dir];
if(in(xx,yy)&&dp[x][y][dir]<dp[xx][yy][dir])
{
dp[xx][yy][dir]=dp[x][y][dir];
q.push_front({xx,yy,dir});
}
if(dp[x][y][dir]+1<dp[x][y][dir1])
{
dp[x][y][dir1]=dp[x][y][dir]+1;
q.push_back({x,y,dir1});
}
if(dp[x][y][dir]+1<dp[x][y][dir2])
{
dp[x][y][dir2]=dp[x][y][dir]+1;
q.push_back({x,y,dir2});
}
}
return -1;
}
int main()
{
fout<<alg();
return 0;
}