#include<iostream>
#include<queue>
#include<stdlib.h>
using namespace std;
queue<int>q;
int x1,y1,x2,y2; //起点和终点坐标(注意题中所给的坐标是从第一行第一列开始的,为了理解方便,我们可以在设数组时也服从从1行1列开始赋值)
int end;//x2,y2即终点坐标的一维形式(用来判断是否到达终点)
char map[13][13];//我们只用第一行(列)到第十二行(列)
int step[200];//记录步数
int used[200];//记录该点是否判断过,若来过则不用来了。。。(1为来过,0为没来过)
void bfs();//广搜
void init();//初始化
void setmap();//设置地图
int canmoveto(int,int);
int moveto(int,int);
int main()
{
cin>>x1>>y1>>x2>>y2;
end=(x2-1)*12+y2;
setmap();
if(x1==x2&&y1==y2)
{
cout<<0<<endl;
}
else
{
init();
bfs();
}
return(0);
}
void bfs()
{
int u,v;
int k;
while(1)
{
u=q.front();
q.pop();
for(k=0;k<4;k++)//k=0,1,2,3分别表示向左下右上四个方向移动
{
if(canmoveto(u,k))
{
v=moveto(u,k);
if(v==end)//判目标
{
cout<<step[u]+1<<endl;
exit(1);
}
else
{
if(used[v]!=1)//判价值(是否来过)
{
q.push(v);
used[v]=1;
step[v]=step[u]+1;
}
}
}
}
}
}
void init()
{
q.push((x1-1)*12+y1);//二维转化为一维形式存入队列(第x1行第y1列在一维里(从1开始)是第 [(x1-1)*12+y1]个)
used[(x1-1)*12+y1]=1;
step[(x1-1)*12+y1]=0;
}
void setmap()
{
int i,j;
for(i=1;i<13;i++)
{
for(j=1;j<13;j++)
{
cin>>map[i][j];
}
}
}
int canmoveto(int u,int k)//此处要判是否可移动(一个是是否越界,一个是是否为'.')
{
int row,col;//一维u向二维转化
if(u%12==0)
{
row=u/12;
col=12;
}
else
{
row=u/12+1;
col=u%12;
}
if(k==0&&col-1>=1)
{
if(map[row][col-1]!='X')
{
return(1);
}
}
else if(k==1&&row+1<=12)
{
if(map[row+1][col]!='X')
{
return(1);
}
}
else if(k==2&&col+1<=12)
{
if(map[row][col+1]!='X')
{
return(1);
}
}
else if(k==3&&row-1>=1)
{
if(map[row-1][col]!='X')
{
return(1);
}
}
return(0);
}
int moveto(int u,int k)
{
int row,col;//一维u向二维转化
if(u%12==0)
{
row=u/12;
col=12;
}
else
{
row=u/12+1;
col=u%12;
}
if(k==0)
{
col=col-1;
}
else if(k==1)
{
row=row+1;
}
else if(k==2)
{
col=col+1;
}
else if(k==3)
{
row=row-1;
}
return((row-1)*12+col);
}