#include <stdio.h>
#define N 1001
int book[N][N];
char a[N][N];
struct note
{
int x;
int y;
int s;
};
int main() {
int n, m, startx, starty, desx, desy;
struct note que[10001000];
int head = 0, tail = 0, cur_x, cur_y, flag = 0;
int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};//右下左上
scanf("%d %d", &n, &m);
scanf("%d%d%d%d", &startx, &starty, &desx, &desy);
for(int i = 1; i <= n; i++)
{
scanf("%s",a[i]+1);// 从 a[i][1] 开始存储!!!
}
//若终点是障碍物则直接输出-1就好
if(a[desx][desy] == '*')
{
printf("-1\n");
return 0;
}
que[tail].x = startx;
que[tail].y = starty;
que[tail].s = 0;
tail++;
book[startx][starty] = 1;
while(head<tail)
{
for(int i = 0; i < 4; i++)
{
cur_x = que[head].x + next[i][0];
cur_y = que[head].y + next[i][1];
if(cur_x<=0 || cur_x>n || cur_y<=0 || cur_y>m)//判断边界
continue;
if(a[cur_x][cur_y]=='.' && book[cur_x][cur_y]==0)//确定不是障碍物,也没有遍历过
{
book[cur_x][cur_y] = 1;
que[tail].x = cur_x;
que[tail].y = cur_y;
que[tail].s = que[head].s + 1;
tail++;
}
if(cur_x == desx && cur_y == desy)
{
flag = 1;
printf("%d\n",que[tail-1].s);
break;
}
}
head++;
if(flag)
break;
}
if(!flag)
printf("-1\n");
return 0;
}