#include<bits/stdc++.h>
using namespace std;
int head,tail,n,m,state[1000100][3],s,x,y,sx,sy,qx,qy;
bool f[1010][1010];//标记点是否走过
int a[1010][1010];
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};//拓展方向
void bfs()
{
head=0;
tail=1;
state[1][0] = sx;
state[1][1] = sy;
do
{
head++;//出队
for (int i=0;i<4;i++)//4个方向
{
x=state[head][0];y=state[head][1];
int j=1;
while (a[x+dx[i]*j][y+dy[i]*j] == 0 && x+dx[i]*j<=n && y+dy[i]*j<=m && x+dx[i]*j>0 && y+dy[i]*j>0)
//如果碰到墙或边缘就结束拓展
{
if (f[x+dx[i]*j][y+dy[i]*j] == false)
//如果已经走过的路线就不入队
{
tail++;//入队
state[tail][0]=x+dx[i]*j;
state[tail][1]=y+dy[i]*j;//储存位置
state[tail][2]=state[head][2]+1;//储存转弯数
f[x+dx[i]*j][y+dy[i]*j]=true;//已经走过该地
if (x+dx[i]*j==qx && y+dy[i]*j==qy)//结束判断
{
s=state[tail][2];
return;
}
}
j++;//下一个拓展
}
}
}
while(head<tail);//空队退出
}
int main()
{
cin>>n>>m;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
cin>>sx>>sy>>qx>>qy;
// scanf("%d%d%d%d",&state[1][0],&state[1][1],&qx,&qy);
//输入不解释
bfs();//函数不解释
cout<<s-1<<endl;
}
/**************************************************************
Problem: 1444
User: admin
Language: C++
Result: Accepted
Time:17 ms
Memory:18776 kb
****************************************************************/