/*
これを入れて実行
g++ code.cpp
./a.out
 */
 
#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>
#include <cstring>
#include <queue>
#include <deque>
#include <stack>
#include <algorithm>
#include <utility>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <cmath>
#include <math.h>
#include <tuple>
#include <iomanip>
#include <bitset>
#include <functional>
#include <cassert>
#include <random>

#define all(x) (x).begin(),(x).end()
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
 
using namespace std;
typedef long long ll;
typedef long double ld;
 
int dy4[4] = {-1, 0, +1, 0};
int dx4[4] = {0, +1, 0, -1};
int dy8[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dx8[8] = {0, 1, 1, 1, 0, -1, -1, -1};
 
const long long INF = 1LL << 60;
const ll MOD = 1e9 + 7;
 
bool greaterSecond(const pair<int, int>& f, const pair<int, int>& s){
    return f.second > s.second;
}
 
ll gcd(ll a, ll b){
	if (b == 0)return a;
	return gcd(b, a % b);
}
 
ll lcm(ll a, ll b){
    return a / gcd(a, b) * b;
}

ll conbinationMemo[100][100];

void cmemoInit(){
    rep(i, 100){
        rep(j, 100){
            conbinationMemo[i][j] = -1;
        }
    }
}
 
ll nCr(ll n, ll r){
    if(conbinationMemo[n][r] != -1) return conbinationMemo[n][r];
    if(r == 0 || r == n){
        return 1;
    } else if(r == 1){
        return n;
    }
    return conbinationMemo[n][r] = (nCr(n - 1, r) + nCr(n - 1, r - 1));
}
 
ll nPr(ll n, ll r){
    r = n - r;
    ll ret = 1;
    for (ll i = n; i >= r + 1; i--) ret *= i;
    return ret;
}
//-----------------------ここから-----------
int main(void){
    ll h, w;
    cin >> h >> w;
    pair<ll,ll> c, d;
    cin >> c.first >> c.second;
    cin >> d.first >> d.second;
    c.first--;
    c.second--;
    d.first--;
    d.second--;

    vector<string> s(h);
    rep(i, h) cin >> s[i];
    ll ans = INF;
    priority_queue<pair<ll,pair<ll,ll>>, vector<pair<ll,pair<ll,ll>>>, greater<pair<ll,pair<ll,ll>>>> q;
    vector<vector<ll>> dist(h, vector<ll>(w, INF));
    dist[c.first][c.second] = 0;
    q.push({0, c});
    while(!q.empty()){
        pair<ll,ll> now = q.top().second;
        ll nowdist = q.top().first;
        q.pop();
        if(dist[now.first][now.second] < nowdist) continue;
        rep(i, 4){
            pair<ll,ll> next;
            next.first = now.first + dx4[i];
            next.second = now.second + dy4[i];
            if(next.first < 0 || next.first >= h || next.second < 0 || next.second >= w) continue;
            if(s[next.first][next.second] == '#') continue;
            if(dist[next.first][next.second] <= nowdist) continue;
            dist[next.first][next.second] = nowdist;
            if(next == d){
                ans = min(ans, nowdist);
            }
            q.push({nowdist, next});
        }

        for(ll i = -2; i <= 2; i++){
            for(ll j = -2; j <= 2; j++){
                pair<ll,ll> next;
                next.first = now.first + i;
                next.second = now.second + j;
                if(next.first < 0 || next.first >= h || next.second < 0 || next.second >= w) continue;
                if(s[next.first][next.second] == '#') continue;
                ll nextdist = nowdist + 1;
                if(dist[next.first][next.second] <= nextdist) continue;
                dist[next.first][next.second] = nextdist;
                if(next == d){
                    ans = min(ans, nextdist);
                }
                q.push({nextdist, next});
            }    
        }
    }

    cout << (ans>=INF?-1:ans) << endl;

}   

Measured memory_bytes: 13612