(File IO): input:family.in output:family.out
时间限制: 1000 ms 空间限制: 128000 KB 具体限制
题目描述
在一个与世隔绝的岛屿上,有一个有趣的现象:同一个家族的人家总是相邻的(这里的相邻是指东南西北四个方向),不同的家族之间总会有河流或是山丘隔绝,但同一个家族的人不一定有相同姓氏。现在给你岛上的地图,求出岛上有多少个不同的家族。岛上的地图有n 行,每行有若干列,每个格子中要么是空格表示大海,要么是‘*’表示河流或山丘,要么是小写字母,表示一户人家的姓氏。
输入
第一行是个数字 ,表示下面信息的行数,接下来是 行字符,每行由小写字母和*号组成,有些行的最前面也可能包含若干连续的空格,表示这些区域是大海,每一行最多不超过 个字符。
输出
一个数字,表示家族数。
样例输入
样例输出
3
数据范围限制
%的数据,
%的数据,
% 的数据, 每一行最多不超过 个字符
解题思路
纯BFS板子题,字符输入那里注意一下就好了。。。
代码
#include<bits/stdc++.h>
using namespace std;
const int dx[5]={0,-1,1,0,0};
const int dy[5]={0,0,0,-1,1};
int n,a[510][510],v[510][510],st[250010][3],h,t,ans,m[510];
char c[510];
bool check(int x,int y,int k)
{
if(x>0&&y>0&&x<=n&&y<=k&&v[x][y]==0&&a[x][y]==1)
return 1;
return 0;
}
void bfs(int x,int y)
{
int xx,yy;
st[1][1]=x;
st[1][2]=y;
v[x][y]=1;
h=0,t=1;
while(h<=t)
{
h++;
for(int i=1;i<=4;i++)
{
xx=st[h][1]+dx[i],yy=st[h][2]+dy[i];
if(check(xx,yy,m[xx]))
{
t++;
st[t][1]=xx;
st[t][2]=yy;
v[xx][yy]=1;
}
}
}
}
int main()
{
freopen("family.in","r",stdin);
freopen("family.out","w",stdout);
scanf("%d",&n);
gets(c);
for(int i=1;i<=n;i++)
{
gets(c);
m[i]=strlen(c);
for(int j=0;j<strlen(c);j++)
{
if(c[j]!=' '&&c[j]!='*')
a[i][j+1]=1;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m[i];j++)
{
if(!v[i][j]&&a[i][j]==1)
{
ans++;
bfs(i,j);
}
}
}
printf("%d\n",ans);
return 0;
}