/*vector_change 走迷宫最短路问题*/
/*
10 10
0 1 9 8
#S########
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
*/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define debug(x) cout<<#x<<":"<<x<<endl
#define N 100
using namespace std;
struct node
{
int x, y;
int num; //表示步数
} a, b;
queue<node> q;
int d[N][N]; //表示访问
char maze[N][N]; //迷宫
int fx, fy, gx, gy; // 初始位置和终点
int dir[4][2] = { {1,0}, {0,1}, {-1,0}, {0,-1}};
int n, m; //迷宫n x m
int bfs()
{
a.x = fx, a.y = fy;
a.num = 0;
d[fx][fy] = 1;
q.push(a);
while ( !q.empty() )
{
b = q.front();
q.pop();
if( b.x == gx && b.y == gy ) break;
for( int i=0; i<4; i++)
{
int x = b.x + dir[i][0];
int y = b.y + dir[i][1];
if( x>=0 && x<n && y>=0 && y<m && maze[x][y] != '#' && d[x][y] == 0)
{
b.num = b.num + 1;
d[x][y] = 1;
b.x = x;
b.y = y;
q.push(b);
}
}
}
return b.num;
}
// 15-2-9
int main()
{
//freopen("1.txt", "r", stdin);
//input
cin>>n>>m;
cin>>fx>>fy>>gx>>gy; //从0开始
memset(d, 0, sizeof(d));
for( int i=0; i<n; i++)
for( int j=0; j<m; j++)
{
cin >> maze[i][j];
}
int ans = bfs();
cout << ans << endl;
return 0;
}