#include<fstream>
using namespace std;
ifstream f("inginer.in");
ofstream g("inginer.out");
struct Pozitie{int lin,col;};
void lee(int n,int m,int l[78][78],int stx,int sty,int spx, int spy)
{
struct Pozitie C[n*m];
Pozitie ps,pc,p,v;
int i;
//Bordura cu 0
for(i=0; i<=m; i++)
l[0] = 0,l[n+1] = 0;
for(i=0; i<=n; i++)
l
- = 0,l[m+1] = 0;
ps.lin = stx; // Poz de start
ps.col = sty;
pc.lin = spx; // Poz de final
pc.col = spy;
int prim=0,ultim=0;
l[ps.lin][ps.col] = 1; // Marcam pozitia de start si de final
l[pc.lin][pc.col] = 0;
int dc[]={0,1,0,-1};
int dl[]={-1,0,1,0};
int dist=0;
C[0] = ps; // Pozitia de start
while(prim <= ultim && l[pc.lin][pc.col] == 0)
{
dist++;
p = C[prim]; prim++;
for(i=0; i<4; i++)
{
v.lin = p.lin + dl;
v.col = p.col + dc;
if(v.lin >= 1 && v.lin <= n+1 && v.col >= 1 && v.col<=m+1)
if(l[v.lin][v.col] == 0)
{
l[v.lin][v.col] = dist;
ultim++;
C[ultim] = v;
}
}
}
if(l[pc.lin][pc.col] == 0) g<<"0\n";
else g<<dist<<"\n";
}
int main()
{
int i,j,n,m,l[78][78];
char x;
int x1,y1,x2,y2;
f>>n>>m;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
f>>x;
if(x == 'X') l[j] = -1; // zid
else l[j] = 0; //culoar
}
do{
f>>x1;
f>>y1;
f>>x2;
f>>y2;
if(x1 != 0 && x2 != 0 && y1 != 0 && y2 != 0)
lee(n,m,l,x1,y1,x2,y2);
}
while(x1 != 0 && x2 != 0 && y1 != 0 && y2 != 0);
f.close();
g.close();
return 0;
}
