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