/* 
  Krishnakant Tiwari
  Problem Link:
  
 */
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define _cin                      \
    ios_base::sync_with_stdio(0); \
    cin.tie(0);
#define endl "\n"
#define pb push_back
#define rep(i, a, b) for (ll i = a; i < b; ++i)
#define repd(i, a, b) for (ll i = a; i >= b; --i)
#define mp make_pair
#define hell 1000000007
#define vvll vector<vector<ll>>
#define vll vector<ll>
#define mll map<ll, ll>
#define sz(x) (ll) x.size()
#define sll set<ll>
#define pll pair<ll, ll>
#define F first
#define S second
#define eb emplace_back
#define ppb pop_back
#define pf push_front
#define ppf pop_front
#define all(x) x.begin(), x.end()
#define clr(x) memset(x, 0, sizeof(x))
#define sortall(x) sort(all(x))
#define tr(it, a) for (auto it = a.begin(); it != a.end(); it++)
#define PI 3.1415926535897932384626
#define deb(x) cout << #x << "=" << x << endl
#define deb2(x, y) cout << #x << "=" << x << "," << #y << "=" << y << endl
#define precise(x) cout << fixed << setprecision(x)
const ll MAX = 1000004;
const ll INF = 1e18L + 5;
template <typename Arg1>
void pn(Arg1 &&arg1)
{
    cout << arg1 << "\n";
}
template <typename Arg1, typename... Args>
void pn(Arg1 &&arg1, Args &&... args)
{
    cout << arg1 << "\n";
    pn(args...);
}
template <typename Arg1>
void ps(Arg1 &&arg1)
{
    cout << arg1 << " ";
}
template <typename Arg1, typename... Args>
void ps(Arg1 &&arg1, Args &&... args)
{
    cout << arg1 << " ";
    ps(args...);
}
template <typename Arg1>
void read(Arg1 &&arg1)
{
    cin >> arg1;
}
template <typename Arg1, typename... Args>
void read(Arg1 &&arg1, Args &&... args)
{
    cin >> arg1;
    read(args...);
}

void solve()
{
    ll h, w;
    read(h, w);
    ll sr, sc, er, ec;
    read(sr, sc);
    read(er, ec);
    sr--, sc--, er--, ec--;
    string mat[h];
    rep(i, 0, h) read(mat[i]);
    ll dis[h][w];
    rep(i, 0, h) rep(j, 0, w) dis[i][j] = INF;
    dis[sr][sc] = 0;
    deque<pll> q;
    q.pb({sr, sc});
    ll dr[] = {1, 0, -1, 0, 1};
    while (!q.empty())
    {
        ll cr, cc;
        pll top = q.front();
        cr = top.first, cc = top.second;
        q.pop_front();
        ll tr, tc;
        rep(i, 0, 4)
        {
            tr = cr + dr[i], tc = cc + dr[i + 1];
            if(tr<h && tr>=0 && tc<w && tc>=0 && mat[tr][tc]=='.'){
                if(dis[tr][tc]>dis[cr][cc]){
                    dis[tr][tc]=dis[cr][cc];
                    q.push_front({tr,tc});
                }
            }
        }
        rep(i,-2,3){
            rep(j,-2,3){
                tr = cr + i, tc = cc + j;
            if(tr<h && tr>=0 && tc<w && tc>=0 && mat[tr][tc]=='.'){
                if(dis[tr][tc]>dis[cr][cc]+1){
                    dis[tr][tc]=dis[cr][cc]+1;
                    q.push_back({tr,tc});
                }
            }

            }
        }
    }
    if(dis[er][ec]==INF) {
        pn(-1);
        return;
    }
    pn(dis[er][ec]);
}

int main()
{

    _cin
    //     ll tc;
    // cin >> tc;
    // while (tc--)
    // {
        solve();
    // }
}

Measured memory_bytes: 12580