#include
#include
#include
using namespace std;
struct Node{
int x,y;
Node(){
x = 0;
y = 0;
}
Node(int a,int b){
x = a;
y = b;
}
};
int r,c,a,b,data[25][25],dx[] = {-1,0,1},dy[] = {-1,0,1},result;
bool visit[25][25];
void bfs(){
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++){
if((i==1&&j==1)||(dx[i]*dy[j]!=0))continue;
int x = a+dx[i];
int y = b+dy[j];
bool flag = false;
if(x<0||x>=r){
result++;
flag = true;
}
if(y<0||y>=c){
result++;
flag = true;
}
if(!flag){
if(!data[x][y]){
result++;
}
}
}
}
while(!q.empty()){
int x = q.front().x;
int y = q.front().y;
q.pop();
for(int i=0;i<3;i++){//计算四周八个点是否有X
for(int j=0;j<3;j++){
if(i==1&&j==1)continue;
int px = x+dx[i];
int py = y+dy[j];
if(px<0||py<0||px>=r||py>=c)continue;
if(data[px][py]==1&&!visit[px][py]){
q.push(Node(px,py));
visit[px][py] = true;
for(int s=0;s<3;s++){
for(int t=0;t<3;t++){
int px_s = px+dx[s];
int py_t = py+dy[t];
if((s==1&&t==1)||(dx[s]*dy[t]!=0))continue;
bool flag = false;
if(px_s<0||px_s>=r){
result++;
flag = true;
}
if(py_t<0||py_t>=c){
result++;
flag = true;
}
if(!flag){
if(!data[px_s][py_t]){
result++;
}
}
}
}
}
}
}
}
}
int main(){
char ch[25];
while(scanf("%d%d%d%d",&r,&c,&a,&b)==4&&r){
memset(data,0,sizeof(data));
memset(visit,false,sizeof visit);
for(int i=0;i){
scanf("%s",ch);
for(int j=0;j){
if(ch[j]=='X')data[i][j] = 1;
}
}
result = 0;
bfs();
printf("%d\n",result);
}
return 0;
}