#include<iostream>
#include<queue>
using namespace std;
struct node{
int x;
int y;
bool useful;
};
queue<node>q;
node start,target;
int used[15][15];
int step[15][15];
char maze[15][15];
int walk[4][2]={
1,0,
-1,0,
0,1,
0,-1,
};
node change(node now,int i)
{
node next;
next.useful=0;
next.x=now.x+walk[i][0];
next.y=now.y+walk[i][1];
if(next.x>=0&&next.x<12&&next.y>=0&&next.y<12&&maze[next.x][next.y]=='.')
next.useful=1;
return next;
}
int bfs()
{
node now,next;
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=0;i<4;i++)
{
next=change(now,i);
if(next.useful&&!used[next.x][next.y])
{
used[next.x][next.y]=1;
step[next.x][next.y]=step[now.x][now.y]+1;
if(next.x==target.x&&next.y==target.y)
return step[next.x][next.y];
else
q.push(next);
}
}
}
return -1;
}
int main()
{
int sx,sy,tx,ty;
cin>>sx>>sy>>tx>>ty;
start.x=sx-1;
start.y=sy-1;
target.x=tx-1;
target.y=ty-1;
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
cin>>maze[i][j];
q.push(start);
cout<<bfs()<<endl;
}