题目链接
题目大意
给定一个n*m的地图,‘W’表示积水,‘.’表示空地,积水是八连通的,求有多少个积水块。
分析
本题是典型的求联通块个数的基础题,思路即用floodfill(漫水填充法),扫描一遍图,每遇到一个‘W’计数器加一,并深搜或者广搜把相邻的‘W’填充为‘.’,直到图上没有积水。
本题要注意字符串的输入:要不就用cin,要不就用getchar()处理好换行符。
代码
#include <iostream>
#include <cstdio>
using namespace std;
char field[1001][1001];
int n,m;
void DFS_floodfill(int x,int y) //floodfill
{
field[x][y]='.';
for (int dx=-1;dx<=1;dx++)
for (int dy=-1;dy<=1;dy++)
{
int xx=x+dx;
int yy=y+dy;
if (xx>=1&&xx<=n&&yy>=1&&yy<=m&&field[xx][yy]=='W')
DFS_floodfill(xx,yy);
}
}
int main()
{
int i,j,ans;
while(scanf("%d%d",&n,&m)!=EOF)
{
getchar();//注意输入地图前也有换行符,很重要!
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
scanf("%c",&field[i][j]);
getchar();
}
ans=0;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (field[i][j]=='W')
{
DFS_floodfill(i,j);
ans++;
}
cout<<ans<<endl;
}
return 0;
}