#include<iostream>
#include<queue>
#include<map>
using namespace std;
char str[13][13];
int a,b,c,d,A,B,C,D;
queue<int>q1;
map<int,int>step;
void init();
int dr[4]={0,1,0,-1};//行的变换
int dc[4]={-1,0,1,0};//列的变换
int canmoveto(int u,int dire);
int moveto(int u,int dire);
int bfs();
int main()
{
int i,j,num;
cin>>A>>B>>C>>D;
a=A-1;
b=B-1;
c=C-1;
d=D-1;
for(i=0;i<12;i++)
{
for(j=0;j<12;j++)
cin>>str[i][j];
}
init();
num=bfs();
cout<<num<<endl;
}
int bfs()
{
int u,v,i;
while(!q1.empty())
{
u=q1.front();
q1.pop();
for(i=0;i<4;i++)
{
if(canmoveto(u,i))
{
v=moveto(u,i);
if(v==c*12+d)
return(step[u]+1);
if(step.count(v)==0)
{
q1.push(v);
step[v]=step[u]+1;
}
}
}
}
return(-1);
}
int canmoveto(int u,int dire)
{
int r,c,ar,ac;
r=u/12;c=u%12;
ar=r+dr[dire];
ac=c+dc[dire];
if(str[ar][ac]=='.')
return 1;
else
return 0;
}
int moveto(int u,int dire)
{
int r,c,ar,ac;
r=u/12;c=u%12;
ar=r+dr[dire];
ac=c+dc[dire];
u=ar*12+ac;
}
void init()
{
int u;
u=a*12+b;
q1.push(u);
step[u]=0;
}
#include<queue>
#include<map>
using namespace std;
char str[13][13];
int a,b,c,d,A,B,C,D;
queue<int>q1;
map<int,int>step;
void init();
int dr[4]={0,1,0,-1};//行的变换
int dc[4]={-1,0,1,0};//列的变换
int canmoveto(int u,int dire);
int moveto(int u,int dire);
int bfs();
int main()
{
int i,j,num;
cin>>A>>B>>C>>D;
a=A-1;
b=B-1;
c=C-1;
d=D-1;
for(i=0;i<12;i++)
{
for(j=0;j<12;j++)
cin>>str[i][j];
}
init();
num=bfs();
cout<<num<<endl;
}
int bfs()
{
int u,v,i;
while(!q1.empty())
{
u=q1.front();
q1.pop();
for(i=0;i<4;i++)
{
if(canmoveto(u,i))
{
v=moveto(u,i);
if(v==c*12+d)
return(step[u]+1);
if(step.count(v)==0)
{
q1.push(v);
step[v]=step[u]+1;
}
}
}
}
return(-1);
}
int canmoveto(int u,int dire)
{
int r,c,ar,ac;
r=u/12;c=u%12;
ar=r+dr[dire];
ac=c+dc[dire];
if(str[ar][ac]=='.')
return 1;
else
return 0;
}
int moveto(int u,int dire)
{
int r,c,ar,ac;
r=u/12;c=u%12;
ar=r+dr[dire];
ac=c+dc[dire];
u=ar*12+ac;
}
void init()
{
int u;
u=a*12+b;
q1.push(u);
step[u]=0;
}