(紀中)1985. 【普及組模擬賽】家族(family)【BFS】

(File IO): input:family.in output:family.out
時間限制: 1000 ms 空間限制: 128000 KB 具體限制


題目描述
在一個與世隔絕的島嶼上,有一個有趣的現象:同一個家族的人家總是相鄰的(這裏的相鄰是指東南西北四個方向),不同的家族之間總會有河流或是山丘隔絕,但同一個家族的人不一定有相同姓氏。現在給你島上的地圖,求出島上有多少個不同的家族。島上的地圖有n 行,每行有若干列,每個格子中要麼是空格表示大海,要麼是‘*’表示河流或山丘,要麼是小寫字母,表示一戶人家的姓氏。


輸入
第一行是個數字 NN,表示下面信息的行數,接下來是 NN 行字符,每行由小寫字母和*號組成,有些行的最前面也可能包含若干連續的空格,表示這些區域是大海,每一行最多不超過 200200 個字符。

輸出
一個數字,表示家族數。


樣例輸入
4zzl

樣例輸出
3


數據範圍限制
1010%的數據, n<=1n<=1
3030%的數據,n<=10n<=10
100100% 的數據, n<=100n<=100 每一行最多不超過 200200 個字符


解題思路
純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;
}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章