//一定要写入列,入列,入列
//main:输入行列交换,st的位置,输出bfs()
//bfs:初始化队列,距离,最大值res,八个方向,队列不空出列,遍历八个方向,不越界,不是石头,第一次,入列标记,返回结果
//main:字符输入,输出bfs
//bfs:初始化队列,距离,方向,出列判断是否完成,遍历方向,不是石头,不越界,是第一次,入列标记,
//如果一条路走不通,那就别走了,换一条,如何思考:你存结果的数组怎么可以变换一下得到答案
//(本题所有距离的最大值就是),或者你定义的所有变量
//每做一道相似的题就记一个一定会用到的变量或typedef,或头文件
//不管什么题都一定要模拟一下样例来理解一下题意变量如何定义,本题行和列交换,一般题意是x与行对应,y与列对应
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;//这个别忘了
const int N=110;
typedef pair<int,int>PII;
int d[N][N];
char g[N][N];
int n,m,mx,my;
int ans=-1;
void bfs()
{
queue<PII>q;
memset(d,-1,sizeof d);
q.push({mx-1,my-1});
d[mx-1][my-1]=0;
int dx[8]={0,1,1,1,0,-1,-1,-1},dy[8]={1,1,0,-1,-1,-1,0,1};
while(q.size())
{
PII t=q.front();q.pop();
for(int i=0;i<8;i++)
{
int x=t.first+dx[i],y=t.second+dy[i];
if(x<0||x>=n||y<0||y>=m)continue;
if(g[x][y]=='*')continue;
if(d[x][y]!=-1)continue;
d[x][y]=d[t.first][t.second]+1;
ans=max(ans,d[x][y]);
q.push({x,y});//记得入列,记得入列,记得入列,重要的事情说三遍
}
}
}
int main()
{
cin>>m>>n>>my>>mx;
for(int i=0;i<n;i++)
cin>>g[i];
g[mx-1][my-1]='M';
bfs();
cout<<ans<<endl;
return 0;
}