#include <bits/stdc++.h>
using namespace std;
int n,m,sx,sy,ex,ey,ans=INT_MAX;
bool vis[1005][1005];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int dx2[]=
{
-2,-2,-2,-2,-2,
-1,-1,-1,-1,-1,
0, 0, 0, 0, 0,
1, 1, 1, 1, 1,
2, 2, 2, 2, 2
};
int dy2[]=
{
-2,-1, 0, 1, 2,
-2,-1, 0, 1, 2,
-2,-1, 0, 1, 2,
-2,-1, 0, 1, 2,
-2,-1, 0, 1, 2,
};
struct node{int x,y,step;};
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>sx>>sy>>ex>>ey;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
char t;
cin>>t;
if(t=='#') vis[i][j]=1;
}
}
deque<node> q;
q.push_front({sx,sy,0});
vis[sx][sy]=1;
while(q.size())
{
auto t=q[0];
q.pop_front();
if(t.x==ex&&t.y==ey)
{
ans=min(ans,t.step);
continue;
}
for(int i=0;i<4;i++)
{
int X=t.x+dx[i];
int Y=t.y+dy[i];
if(!(1<=X&&X<=n&&1<=Y&&Y<=m&&!vis[X][Y])) continue;
q.push_front({X,Y,t.step});
vis[X][Y]=1;
}
for(int i=0;i<25;i++)
{
int X=t.x+dx2[i];
int Y=t.y+dy2[i];
if(!(1<=X&&X<=n&&1<=Y&&Y<=m&&!vis[X][Y])) continue;
q.push_back({X,Y,t.step+1});
vis[X][Y]=1;
}
}
if(ans==INT_MAX) ans=-1;
cout<<ans;
return 0;
}
/*
1 2 3 4 5
2 . . . .
3 . . . .
4 . . . .
5 . . . .
*/