#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <queue>
#define fzhead EDGE(int _to, int _v, int _next)
#define fzbody to(_to), v(_v), next(_next)
#define For(i,x,y) for (int i=(x);i<=(y);i++)
#define FOR(i,x,y) for (int i=(x);i<=(y);i++)
#define mst(x,a) memset(x,a,sizeof(x))
#define mp make_pair
#define fi first
#define se second
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int, int>pa;
typedef pair<ll,ll>PA;
inline int read()
{
    int ans=0;
    char c=getchar();bool neg=false;
    while(c<'0'||c>'9')
    {
        if(c=='-')neg=true;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        ans=ans*10+c-'0';
        c=getchar();
    }
    return (neg)?-ans:ans;
}
void write(int x)
{
    if(x<0)
    {
        putchar('-');
        x=-x;
    }
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
const int maxn=4e6+10;
int head[maxn<<1], dis[maxn], vis[maxn];
int cnt,n,m;
struct EDGE
{
    int to,v,next;
    EDGE(){}
    fzhead:fzbody{}
}e[maxn<<1];
void add(int bg, int ed, int v)
{
    e[++cnt]=EDGE(ed, v, head[bg]);
    head[bg]=cnt;
}
inline void dij(int s)
{
    For(i, 1, n)vis[i]=0;
    priority_queue<pa>q;
    dis[s]=0;q.push(mp(0,s));
    while(!q.empty())
    {
        int u=q.top().se;
        q.pop();
        if(vis[u])continue;
        vis[u]=1;
        //cout<<u<<endl;
        for(int i=head[u]; i!=-1; i=e[i].next)
        {
            if(dis[e[i].to]>dis[u]+e[i].v)
            {
                dis[e[i].to]=dis[u]+e[i].v;
                q.push(mp(-dis[e[i].to],e[i].to));
            }
        }
    }
}
char g[1010][1010];
int use[1010][1010];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int cx[20]={ 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2,-1,-1,-1,-1,-2,-2,-2,-2,-2};
int cy[20]={ 2,-2, 1, 2,-1,-2, 0, 1, 2,-1,-2, 1, 2,-1,-2, 0, 1, 2,-1,-2};
struct point {
    int x,y;
};
int sx,sy,ex,ey;
bool bfs1(int r, int c, int num){
    queue<point>q;q.push({r,c});
    bool flag=false;
    while(!q.empty()){
        point u=q.front();q.pop();
        r=u.x,c=u.y;
       // cout<<r<<' '<<c<<endl;
        if(r==ex&&c==ey)flag=1;
        if(use[r][c])continue;
        use[r][c]=num;
        for(int i=0; i<4; i++){
            int tx=r+dx[i];
            int ty=c+dy[i];
            if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&g[tx][ty]=='.'&&!use[tx][ty]){
                q.push({tx,ty});
            }
        }
    }
    if(flag)return true;
    else return false;
}
const int inf=0x3f3f3f3f;
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    mst(head,-1);mst(dis,0x3f);
    cin>>n>>m;
    cin>>sx>>sy;
    cin>>ex>>ey;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++)cin>>g[i][j];
    }
   // cout<<"OK"<<endl;
    if(bfs1(sx,sy,1)){
        cout<<0<<endl;
        return 0;
    }
    //cout<<endl;
    int col=2;
    int st=1,ed;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            if(!use[i][j]&&g[i][j]=='.'){
                bfs1(i,j,col);//ed=col;
              //  cout<<col<<endl;
                col++;
            }
            //if(i==ex&&j==ey)ed=use[i][j];
        }
    }
    ed=use[ex][ey];
    //cout<<ed<<endl;
    col--;
    //cout<<"OK"<<endl;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            if(use[i][j]){
                for(int k=0; k<20; k++){
                    int tx=i+cx[k];
                    int ty=j+cy[k];
                    if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&g[tx][ty]=='.'&&use[tx][ty]!=use[i][j]&&use[tx][ty])add(use[i][j],use[tx][ty],1);
                }
            }
        }
    }
    dij(st);
    //cout<<st<<' '<<ed<<endl;
   // cout<<ex<<' '<<ey<<endl;
    if(dis[ed]!=inf)cout<<dis[ed]<<endl;
    else cout<<-1<<endl;
    return 0;
}


Measured memory_bytes: 77164