#include <bits/stdc++.h>
#define rep(i, s, n) for (int i = s; i < n; i++)
#define rp(i,n) for (int i=0;i<n;i++)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define all_acc(x) (x).begin(), (x).end(), 0LL
#define int long long
#define absSort(v) sort(a.begin(), a.end(), [](int i, int j) -> bool { return abs(i) < abs(j); });
using namespace std;
using P = pair<int, int>;
using Graph = vector<vector<int>>;
using ll = long long;
double pi=3.14159265359;

template <class T, class U>
void chmin(T& t, const U& u) {
    if (t > u) t = u;
}
template <class T, class U>
void chmax(T& t, const U& u) {
    if (t < u) t = u;
}

//出力するよ
void output_tate(vector<int> s){
    int n = s.size();
    for (int i = 0; i < n; i++){
        //if (i != 0)
        //    cout << " ";
        cout << s[i]<<endl;
    }
    //cout << endl;
}

void output_yoko(vector<int> s){
    int n = s.size();
    for (int i = 0; i < n; i++){
        if (i != 0)
            cout << " ";
        cout << s[i];//<<endl;
    }
    cout << endl;
}

void output_yoko(vector<char> s){
    int n = s.size();
    for (int i = 0; i < n; i++){
        if (i != 0)
            cout << " ";
        cout << s[i];//<<endl;
    }
    cout << endl;
}

//01BFS
//edgesは重み付きグラフ
//disは、とても大きい数で初期化する必要がある
void bfs01(vector<int> &dis, vector<vector<pair<int,int>>> edges, int s){
    int n = dis.size();
    dis[s] = 0;
    deque<int> que;
    que.push_back(s);

    while(que.size()){
        int i = que.front(); que.pop_front();
        for(auto p : edges[i]){
            int j = p.first;
            int c = p.second;
            int d = dis[i] + c;
            if(d < dis[j]){
                dis[j] = d;
                if(c){
                    que.push_back(j);
                }else{
                    que.push_front(j);
                }
            }
        }
    }
}

int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};

signed main() {
    int h,w; cin>>h>>w;
    int ch,cw; cin>>ch>>cw;
    int dh,dw; cin>>dh>>dw;
    vector<vector<pair<int,int>>> G(h*w);
    vector<int> dis(h*w);
    ch--; cw--;
    dh--; dw--;
    vector<vector<char>> grid(h,vector<char>(w));

    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            char ci; cin>>ci;
            grid[i][j] = ci;
        }
    }

    for(int i=0;i<h;i++) for(int j=0;j<w;j++){
        if(grid[i][j]=='#') continue;
        for(int k=0;k<4;k++){
            //cout<<"apa"<<endl;
            int ni = i + dy[k];
            int nj = j + dx[k];
            if(ni<0 || ni>=h || nj<0 || nj>=w) continue;
            if(grid[ni][nj]=='#') continue;
            G[w*i+j].push_back({w*ni+nj,0});
            //cout<<"a"<<endl;
        }
        for(int ni=i-2;ni<=i+2;ni++){
            for(int nj=j-2;nj<=j+2;nj++){
                if(ni<0 || ni>=h || nj<0 || nj>=w) continue;
                if(grid[ni][nj]=='#') continue;
                G[w*i+j].push_back({w*ni+nj,1});
                //cout<<"b"<<endl;
            }
        }
        //cout<<"c"<<endl;
    }

    //cout<<1<<endl;

    rp(i,h*w) dis[i] = 10000000000;
    bfs01(dis,G,w*ch+cw);
    int ans = dis[w*dh+dw];
    if(ans==10000000000) cout<<-1<<endl;
    else cout<<ans<<endl;

}


Measured memory_bytes: 353392