// C
#ifndef _GLIBCXX_NO_ASSERT
#include <cassert>
#endif
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>

#ifdef __GXX_EXPERIMENTAL_CXX0X__
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cwchar>
#include <cwctype>
#endif

// C++
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>

#ifdef __GXX_EXPERIMENTAL_CXX0X__
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#endif
//#include <bits/stdc++.h>

#define all(v) v.begin(), v.end()
typedef long long ll;
#define rep(i, z, n) for(int i = z; i < n; i++)
//const int INF = 1<<29;
//const ll MOD = 1000000007;
#define P pair<int, int>
using namespace std;

void fill_island(vector<vector<char>> &board, vector<vector<bool>> &checked, int y, int x) {
  if (y < 0 || x < 0 || y >= 10 || x >= 10) return;
  if (board.at(y).at(x) == 'x') return;
  if (checked.at(y).at(x)) return;
 
  checked.at(y).at(x) = true;  // 既に調べているという状態に変えておく
  fill_island(board, checked, y - 1, x    );  // 上
  fill_island(board, checked, y    , x + 1);  // 右
  fill_island(board, checked, y + 1, x    );  // 下
  fill_island(board, checked, y    , x - 1);  // 左
}

int main(){
    int H, W;
    cin >> H >> W;
    int Ch, Cw, Dh, Dw;
    cin >> Ch >> Cw >> Dh >> Dw;
    vector<vector<char>> S(H, vector<char>(W));
    rep(i, 0, H){
        rep(j, 0, W){
            cin >> S.at(i).at(j);
        }
    }
    
    stack<P> st, pst;
    st.push(P(Ch - 1, Cw - 1));
    pst.push(P(Ch - 1, Cw - 1));
    
    
    int sum = 0;
    
    vector<vector<bool>> reach(H, vector<bool>(W, false));
    vector<vector<bool>> pre(H, vector<bool>(W, false));
    
    while(true){
        
        while(!st.empty()){
            P top = st.top();
            st.pop();
            int h = top.first;
            int w = top.second;
            reach.at(h).at(w) = true;
            
            
            if((h == Dh - 1) && (w == Dw - 1)){
                cout << sum << endl;
                return 0;
            }
            
            if(h + 1 < H){
                if((S.at(h + 1).at(w) == '.') && (!reach.at(h + 1).at(w))){
                    st.push(P(h + 1, w));
                }
            }
            if(h - 1 >= 0){
                if((S.at(h - 1).at(w) == '.') && (!reach.at(h - 1).at(w))){
                    st.push(P(h - 1, w));
                }
            }
            if(w + 1 < W){
                if((S.at(h).at(w + 1) == '.') && (!reach.at(h).at(w + 1))){
                    st.push(P(h, w + 1));
                }
            }
            if(w - 1 >= 0){
                if((S.at(h).at(w - 1) == '.') && (!reach.at(h).at(w - 1))){
                    st.push(P(h, w - 1));
                }
            }
            
            rep(i, -2, 3){
                rep(j, -2, 3){
                    if((h + i >= 0) && (h + i < H) && (w + j >= 0) && (w + j < W)){
                        if(!pre.at(h + i).at(w + j) && !reach.at(h + i).at(w + j) && S.at(h + i).at(w + j) == '.'){
                            pst.push(P(h + i, w + j));
                            pre.at(h + i).at(w + j) = true;
                        }
                    }
                }
            }
        }
        
        if(pst.empty()){
            cout << - 1 << endl;
            return 0;
        }
        
        while(!pst.empty()){
            P top = pst.top();
            pst.pop();
            int h = top.first;
            int w = top.second;
            S.at(h).at(w) = '.';
            if(!reach.at(h).at(w)) st.push(P(h, w));
            reach.at(h).at(w) = true;
        }
        sum++;
        
    }
}

Measured memory_bytes: 4968