#include <bits/stdc++.h>
using namespace std;
typedef long long lol;

//マクロ
//forループ関係
//引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
//Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
#define REP(i,n) for(lol i=0;i<lol(n);i++)
#define REPD(i,n) for(lol i=n-1;i>=0;i--)
#define FOR(i,a,b) for(lol i=a;i<=lol(b);i++)
#define FORD(i,a,b) for(lol i=a;i>=lol(b);i--)
#define VL vector<lol>
//xにはvectorなどのコンテナ
#define ALL(x) x.begin(),x.end() //sortなどの引数を省略したい
#define SIZE(x) lol(x.size()) //sizeをsize_tからllに直しておく
//定数
#define PI 3.1415926535897932385 //pi
#define INF 1000000000000 //10^12:極めて大きい値,∞
#define MOD 1000000007 //10^9+7:合同式の法
#define MAXR 100000 //10^5:配列の最大のrange(素数列挙などで使用)
//最大値最小値
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }
int gcd(int a,int b){return b?gcd(b,a%b):a;}

int main()
{
    lol result{0};
    lol h, w; cin >> h >> w;
    lol ch, cw, dh, dw; cin >> ch >> cw >> dh >> dw;
    int s[h+5][w+5]; memset(s, -1, sizeof(s));
    FOR(i, 1, h)
        FOR(j, 1, w)
        {
            char ch; cin >> ch;
            if(ch == '.') s[i][j] = 0;
            else s[i][j] = 1;
        }
    //グループ化
    int dx[4] = {-1, 0, 1, 0};
    int dy[4] = {0, -1, 0, 1};
    int dx2[20] = {-2, -2, -2, -2, -2, -1, -1, -1, -1, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2};
    int dy2[20] = {-2, -1, 0, 1, 2, -2, -1, 1, 2, -2, 2, -2, -1, 1, 2, -2, -1, 0, 1, 2};
    int b[h+1][w+1] = {};
    lol count{1};
    queue<pair<int, int>> que;
    que.push(make_pair(ch, cw));
    b[ch][cw] = count;
    bool TF = true;
    list<pair<int, int>> lists;
    lists.push_back({ch, cw});
    while(TF)
    {
        if(b[dh][dw] != 0){TF=false; break;}
        while(!que.empty())
        {
            int curx = que.front().first, cury = que.front().second; que.pop();
            REP(i, 4)
            {
                int x = curx + dx[i], y = cury + dy[i];
                if(x < 1 || x > h || y < 1 || y > w) continue;
                if(b[x][y] == 0 && s[x][y] == 0)
                {
                    b[x][y] = count;
                    que.push({x, y});
                    lists.push_back({x, y});
                    //cout << "w:";
                }
            }
            //cout << "a\n";
        }
        if(b[dh][dw] != 0){TF=false; break;}
        count++;
        TF = false;
        //cout << TF << endl;
        list<pair<int, int>> lists2(lists);
        lists.clear();

        for(list<pair<int, int>>::iterator itr = lists2.begin(); itr != lists2.end(); itr++)
        {
            int i = itr->first, j = itr->second;
            //cout << "lists:" << i << " " << j << endl;
            REP(k, 20)
            {
                int x = i + dx2[k], y = j + dy2[k];
                if(x < 1 || x > h || y < 1 || y > w) continue;
                if(b[x][y] == 0 && s[x][y] == 0)
                {
                    b[x][y] = count;
                    que.push({x, y});
                    lists.push_back({x, y});
                    TF = true;
                }
            }
        }

        if(!TF) count = 0;
        //lists.clear();
    }
    result = count - 1;
    cout << result << endl;
    return 0;
}

Measured memory_bytes: 12040