题目描述
在一个正方形的水平桌面上,可以将其划分为n*n的矩阵,1<=n<=100。如果矩阵的某一位置有一滴水则该位置对应的矩阵元素用W表示,否则用O表示。当一滴水的直接相邻的8个方向上的任一位置也有水滴时,他们会连接在一起而汇聚成一大滴水。不直接相邻的8个方向的水滴则不能汇聚。给出桌面上的水滴信息,求最后又几滴水?无论水滴多大都算一滴。
输入格式
多组输入,第一行一个正整数n,接下来输入n*n的矩阵,输入以文件未结束。
输出格式
每组输出最终有几滴水,每组输出独占一行。
输入样例
5
WWOOW
WWWWO
WOWOW
OOOOO
WWWWW
输出样例
2
#include<iostream>
using namespace std;
const int maxn=10001;
int n;
char map[maxn][maxn];
int fx[2][8]={{-1,0,1,0,-1,-1,1,1},{0,-1,0,1,-1,1,-1,1}}; //方向数组
void dfs(int x,int y)
{
map[x][y]='O';
for(int i=0;i<8;i++)
{
int dx=x+fx[0][i];
int dy=y+fx[1][i];
if(map[dx][dy]=='W'&&dx>=0&&dx<n&&dy>=0&&dy<n) //深度搜索标记
{
bfs(dx,dy);
}
}
return;
}
int main()
{
while(cin>>n)
{
int tj=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>map[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(map[i][j]=='W')
{
bfs(i,j);
tj++;
}
}
}
cout<<tj<<endl;
}
return 0;
}