题解 P1767 【家族_NOI导刊2010普及(10)】
看各位dalao都用dfs,本蒟蒻就来发一篇bfs,
其实这题的确不难着实很坑。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int dx[4]={1,-1,0,0};
const int dy[4]={0,0,1,-1};
string s;
int n,cnt,l[510],a[550][550]; //最大的坑点,必须开大点,本蒟蒻开210,只有40分
void bfs(int x,int y)
{
queue< pair<int,int> >q; //申请队列,用pair封装,方便存取,也可以用结构体
q.push(make_pair(x,y));
a[x][y]=0;
while(!q.empty())
{
int cx=q.front().first;
int cy=q.front().second; //取队首元素
q.pop(); //队首元素出列
for(int i=0;i<4;i++)
{
int nx=cx+dx[i];
int ny=cy+dy[i]; //向四个方向搜素
if(nx>=1 && nx<=n && ny>=1 && ny<=l[nx] && a[nx][ny]==1)
{
a[nx][ny]=0; //赋0,避免重复
q.push(make_pair(nx,ny)); //入队列
}
}
}
}
int main()
{
scanf("%d",&n);
getline(cin,s);
for(int i=1;i<=n;i++)
{
getline(cin,s);
l[i]=s.length();
for(int j=1;j<=l[i];j++)
{
if(s[j-1]>='a' && s[j-1]<='z')
a[i][j]=1; //读入预处理,是字母为1,其余为0
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=l[i];j++)
{
if(a[i][j]==1) //遇到字母,bfs
{
bfs(i,j);
cnt++; //统计家族数
}
}
printf("%d\n",cnt);
return 0;
}