#include
#include
#include
using namespace std;
char data[25][25];
bool visit[25][25];
int r,c,a,b,result;
struct Node{
int x,y;
Node(int a,int b){
x = a;
y = b;
}
};
const int dx[] = {-1,0,1},dy[] = {-1,0,1};
void bfs(){
memset(visit,false,sizeof visit);
a--;
b--;
queueq;
q.push(Node(a,b));
visit[a][b] = true;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
int x = a+dx[i];
int y = b+dy[j];
bool flag = false;
if((i==1&&j==1)||(dx[i]*dy[j]!=0))continue;
if(x<0||x>=r){
flag = true;
result++;
}
if(y<0||y>=c){
flag = true;
result++;
}
if(!flag){
if(data[x][y]=='.'){
result++;
}
}
}
}
while(!q.empty()){
int qx = q.front().x;
int qy = q.front().y;
q.pop();
for(int s=0;s<3;s++){
for(int t=0;t<3;t++){
if(s==1&&t==1)continue;
int qx_s = qx+dx[s];
int qy_t = qy+dy[t];
if(qx_s<0||qx_s>=r||qy_t<0||qy_t>=c)continue;
if(data[qx_s][qy_t]=='X'&&visit[qx_s][qy_t]==false){
q.push(Node(qx_s,qy_t));
visit[qx_s][qy_t] = true;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
int x = qx_s+dx[i];
int y = qy_t+dy[j];
bool flag = false;
if((i==1&&j==1)||(dx[i]*dy[j]!=0))continue;
if(x<0||x>=r){
flag = true;
result++;
}
if(y<0||y>=c){
flag = true;
result++;
}
if(!flag){
if(data[x][y]=='.'){
result++;
}
}
}
}
}
}
}
}
}
int main(){
while(scanf("%d%d%d%d",&r,&c,&a,&b)==4&&r){
for(int i=0;i){
scanf("%s",data[i]);
}
result = 0;
bfs();
printf("%d\n",result);
}
return 0;
}