http://acm.pku.edu.cn/JudgeOnline/problem?id=1111

http://acm.pku.edu.cn/JudgeOnline/images/1111/1111_1.gif

Код:
#include<stdio.h>

char image[20][20];
int note[20][20];
int res=0;
int row,column;

void expand(int x,int y);

int main(){
 
   int clickx,clicky;
   int i,j;

   while(1){
       scanf("%d%d%d%d",&row,&column,&clickx,&clicky);
      if(row==0&&column==0&&clickx==0&&clicky==0) break;

        for(i=0;i<row;i++) scanf("%s",image[i]);
       
        for(i=0;i<row;i++)
         for(j=0;j<column;j++)
            note[i][j]=0;

      res=0;
      expand(clickx-1,clicky-1);

      printf("%d\n",res);
   }

   return 0;
}

void expand(int x,int y){
   
    if(image[x][y]=='.') return;   
 
   note[x][y]=1;
   
    if(image[x-1][y]=='.'||x-1<0) res+=1;
   else if(!note[x-1][y]) expand(x-1,y);
   
   if(image[x+1][y]=='.'||x+1>=row) res+=1;
   else if(!note[x+1][y]) expand(x+1,y);

    if(image[x][y-1]=='.'||y-1<0) res+=1;
   else if(!note[x][y-1]) expand(x,y-1);
   
    if(image[x][y+1]=='.'||y+1>=column) res+=1;
   else if(!note[x][y+1]) expand(x,y+1);

   if(x-1>=0&&y-1>=0)
        if(image[x-1][y-1]=='X'&&!note[x-1][y-1]) expand(x-1,y-1);

   if(x-1>=0&&y+1<column)
        if(image[x-1][y+1]=='X'&&!note[x-1][y+1]) expand(x-1,y+1);
   
   if(x+1<row&&y-1>=0)
      if(image[x+1][y-1]=='X'&&!note[x+1][y-1]) expand(x+1,y-1);
   
   if(x+1<row&&y+1<column)
        if(image[x+1][y+1]=='X'&&!note[x+1][y+1]) expand(x+1,y+1);
   
   return;
}