POJ1111

#include <iostream>
#include <string.h>
using namespace std;

char grid[25][25];
int vis[25][25];
int n,m,x,y,tol;
void DFS(int a,int b)
{
  vis[a][b]=1;
  if(b+1<=m)//右面
  {
    if(b+1==m)
    {
      tol++;
    }
    else
    {
      if(grid[a][b+1]=='X'&&vis[a][b+1]==0)
      {
        DFS(a,b+1);
      }
      if(grid[a][b+1]=='.')
      {
        tol++;
      }
    }
  }
  if(b-1>=-1)//左面
  {
    if(b-1==-1)
    {
      tol++;
    }
    else
    {
      if(grid[a][b-1]=='X'&&vis[a][b-1]==0)
      {
        DFS(a,b-1);
      }
      if(grid[a][b-1]=='.')
      {
        tol++;
      }
    }
  }
  if(a-1>=-1)//上面
  {
    if(a-1==-1)
    {
      tol++;
    }
    else
    {
      if(grid[a-1][b]=='X'&&vis[a-1][b]==0)
      {
        DFS(a-1,b);
      }
      if(grid[a-1][b]=='.')
      {
        tol++;
      }
    }
  }
  if(a+1<=n)//下面
  {
    if(a+1==n)
    {
      tol++;
    }
    else
    {
      if(grid[a+1][b]=='X'&&vis[a+1][b]==0)
      {
        DFS(a+1,b);
      }
      if(grid[a+1][b]=='.')
      {
        tol++;
      }
    }
  }
  if(b-1>-1&&a-1>-1&&grid[a-1][b-1]=='X'&&vis[a-1][b-1]==0)//左上
  {
    DFS(a-1,b-1);
  }
  if(b-1>-1&&a+1<n&&grid[a+1][b-1]=='X'&&vis[a+1][b-1]==0)//左下
  {
    DFS(a+1,b-1);
  }
  if(b+1<m&&a-1>-1&&grid[a-1][b+1]=='X'&&vis[a-1][b+1]==0)//右上
  {
    DFS(a-1,b+1);
  }
  if(b+1<m&&a+1<n&&grid[a+1][b+1]=='X'&&vis[a+1][b+1]==0)//右下
  {
    DFS(a+1,b+1);
  }
}

int main()
{
  int i,j;
  while(cin>>n>>m>>x>>y,n)
  {
    tol=0;x--,y--;
    memset(vis,0,sizeof(vis));
    for(i=0;i<n;i++)
    {
      for(j=0;j<m;j++)
      {
        cin>>grid[i][j];
      }
    }
    DFS(x,y);
    cout<<tol<<endl;
  }
return 0;
}

posted @ 2013-05-08 22:24  algorithms爱好者  阅读(101)  评论(0)    收藏  举报