这是一道比较适合我的深搜题,自我感觉这题比较好,做了很久才搞定,下面附代码;
注意在x处理周长时考虑全面;
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
char map[25][25];
int visit[25][25];
int count;
int m,n;
int bam[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};
void dfs(int a,int b)//开始深搜
{
visit[a][b]=1;
int i;
for(i=0;i<8;i++)
{
int x=a+bam[i][0];
int y=b+bam[i][1];
if(x>=1&&x<=m&&y>=1&&y<=n)排除超出数组边界的范围
{
if(map[x][y]=='X'&&visit[x][y]==0)//判断符合数组范围内的点是否是x,如果是开始深搜
dfs(x,y);
else if(map[x][y]=='.'&&(x==a||y==b))
//同时判断符合数组范围内的点在上下左右四个方向是否有‘。’,有的话count加一
{
count++;
}
}
else if(x==a||y==b)超出数组范围的点(即处理在边界的点)
count++;
}
}
int main ()
{
int x,y;
ifstream cin("in.txt");
while(cin>>m>>n>>x>>y,m+n+x+y)
{
memset(visit,0,sizeof(visit));//数组初始化
memset(map,0,sizeof(map));
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cin>>map[i][j];
}
}
count=0;
dfs(x,y);
cout<<count<<endl;;
}
return 0;
}