#include <bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair

using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod  = 1e9 + 7;
const ll N = 1e3 + 5;

int n,m,sx,sy,ex,ey;
int vis[N][N];
char a[N][N];

struct node{
	int x,y,z;
	bool operator <(const node &T) const{
		return z>T.z;
	}
};

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin>>n>>m>>sx>>sy>>ex>>ey;
    for(int i=1;i<=n;i++) cin>>a[i]+1;
    priority_queue<node> q;
    memset(vis,-1,sizeof(vis));
    vis[sx][sy]=0;
    q.push({sx,sy,0});
    while(q.size()){
    	node t=q.top();q.pop();
    	if(t.z>=vis[ex][ey] and vis[ex][ey]!=-1) break;
    	// if(vis[ex][ey]!=-1) break;
    	int x=t.x,y=t.y,z=t.z;
    	for(int i=-2;i<=2;i++){
    		for(int j=-2;j<=2;j++){
    			int tx=x+i;
    			int ty=y+j;
    			int tz=z;
	    		if(abs(tx-x)+abs(ty-y)>1) tz++;
    			if(tx>=1 and tx<=n and ty>=1 and ty<=m and a[tx][ty]=='.' and (vis[tx][ty]==-1 || tz<vis[tx][ty])){
	    			vis[tx][ty]=tz;
	    			q.push({tx,ty,tz});
	    		}
    		}
    	}
    }
    cout<<vis[ex][ey]<<'\n';
    return 0;
}