http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=47
#include<iostream>
#include
<queue>
#include
<string>
using namespace std;
struct Node
{
    
int vi;
    
int vj;
}
;
string str[21];
bool mark[21][21];
int m,n,si,sj,sum;
int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{1,-1},{-1,1},{1,1}};
//八个方向
void bfs()
{
    
int k;
    Node p,q;
    queue
<Node>Q;
    p.vi
=si;
    p.vj
=sj;
    mark[si][sj]
=1;
    Q.push(p);
    
while(!Q.empty())
    
{
        q
=Q.front();
        Q.pop();
        
for(k=0;k<4;k++)//上、下、左、右
        {
            p.vi
=q.vi+dir[k][0];
            p.vj
=q.vj+dir[k][1];
            
if(p.vi>=0 && p.vi<&& p.vj>=0 && p.vj<n)
            
{
                
if(str[p.vi][p.vj]=='.')
                    sum
++;
                
else if(str[p.vi][p.vj]=='X' && mark[p.vi][p.vj]==0)
                
{
                    mark[p.vi][p.vj]
=1;
                    Q.push(p);
                }

            }

            
else
                sum
++;
        }

        
for(k=4;k<8;k++)//左上、左下、右上、右下
        {
            p.vi
=q.vi+dir[k][0];
            p.vj
=q.vj+dir[k][1];
            
if(p.vi>=0 && p.vi<&& p.vj>=0 && p.vj<n)
            
{
                
if(str[p.vi][p.vj]=='X' && mark[p.vi][p.vj]==0)
                
{
                    mark[p.vi][p.vj]
=1;
                    Q.push(p);
                }

            }

        }

    }
//while(!Q.empty())
}


int main()
{
    
while(cin>>m>>n>>si>>sj && m+n+si+sj)
    
{
        si
--;
        sj
--;
        
int i,j;
        
for(i=0;i<m;i++)
            cin
>>str[i];
        sum
=0;
        memset(mark,
0,sizeof(mark));
        bfs();
        cout
<<sum<<endl;
    }

    
return 0;
}