题目大意:有一个大小为N*M的园子,雨后积了很多水。八连通的积水被认为是在一起的。请求出园子里共有多少个水洼?(八连通是指相邻的八个方向)
解题思路:找到一个‘W’对其周围也是‘W’的进行深搜,深搜的次数即为八连通的块数
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string>
#include <queue>
#include <vector>
#include <list>
#include <stack>
#include <map>
#include <set>
using namespace std;
const int maxn = 1000+100;
const int dir[8][2] = {{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
char s[maxn][maxn];
int n,m;
void dfs(int x,int y)
{
s[x][y] = '.';
for(int i = 0; i < 8; i++)
{
int xx = x+dir[i][0];
int yy = y+dir[i][1];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&s[xx][yy]=='W')
dfs(xx,yy);
}
return ;
}
int main()
{
while(scanf("%d%d",&n,&m) != EOF)
{
getchar();
for(int i = 0; i < n; i++)
gets(s[i]);
int sum = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
if(s[i][j] == 'W')
{
dfs(i,j);
sum++;
}
printf("%d\n",sum);
}
return 0;
}