(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;
}