自己把数组开小了,只开了21,如果行、列为20的话,就不够左右都空出一行了,还是自己的思维太死板了。
#include<cstdio>
#include<cstring>
#include<iostream>
#define check(a1,b1) (a1>0&&a1<=row&&b1>0&&b1<=col)
using namespace std;
const int N = 50;
int di[8][2]={-1,-1,1,1,1,-1,-1,1,1,0,0,1,-1,0,0,-1};
int row,col,x,y,num;
char map[N][N];
bool vis[N][N];
int arr[4][2]={1,0,0,1,-1,0,0,-1};
void dfs(int n,int m)
{
for(int i=0;i<8;++i)
{
int a,b;
a = n+di[i][0]; b = m+di[i][1];
if(!vis[a][b]&&map[a][b]=='X'&&(check(a,b)))
{
vis[a][b]=true;
dfs(a,b);
}
}
}
void solve()
{
for(int i=1;i<=row;++i)
for(int j=1;j<=col;++j)
if(vis[i][j])
{
for(int e=0;e<4;++e)
{
int a,b;
a = i+arr[e][0]; b = j+arr[e][1];
if(!vis[a][b])
++num;
}
}
}
int main(void)
{
while(scanf("%d %d %d %d",&row,&col,&x,&y),row||col||x||y)
{
num = 0;
for(int i=1;i<=row;++i)
scanf("%s",map[i]+1);
memset(vis,false,sizeof(vis));
vis[x][y] = true;
dfs(x,y);
solve();
cout<<num<<endl;
}
return 0;
}