连通块
时间限制: 1 Sec 内存限制: 128 MB
题目描述
一个n * m的方格图,一些格子被涂成了黑色,在方格图中被标为1,白色格子被标为0。问有多少个四连通的黑色格子连通块。四连通的黑色格子连通块指的是一片由黑色格子组成的区域,其中的每个黑色格子能通过四连通的走法(上下左右),只走黑色格子,到达该连通块中的其它黑色格子。
输入
第一行两个整数n,m(1<=n,m<=100),表示一个n*m的方格图。
接下来n行,每行m个整数,分别为0或1,表示这个格子是黑色还是白色。
输出
只有一行,一个整数ans,表示图中有ans个黑色格子连通块。
样例输入
3 3
1 1 1
0 1 0
1 0 1
样例输出
3
解法:队列
- 我们对于每一个点,如果是黑格子并且没有搜索过,那么我们就把它加入队列,同时答案加1,然后开始搜索四周相邻的点
AC代码
#include<cstdio>
#include<queue>
#define re register int
using namespace std;
struct node {
int x,y;
node (int xx,int yy) {
x=xx,y=yy;
}
};
int n,m,cnt; queue<node> q;
bool f[105][105],v[105][105];
const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int main() {
scanf("%d%d",&n,&m);
for(re i=1;i<=n;i++) {
for(re j=1;j<=m;j++) {
scanf("%d",&f[i][j]);
}
}
for(re i=1;i<=n;i++) {
for(re j=1;j<=m;j++) {
if(f[i][j]&&!v[i][j]) {
v[i][j]=1;
q.push(node(i,j)); cnt++;
while(q.size()) {
node x=q.front(); q.pop();
int bx=x.x,by=x.y;
for(re k=0;k<4;k++) {
int nx=bx+dx[k],ny=by+dy[k];
if(f[nx][ny]&&!v[nx][ny]) {
q.push(node(nx,ny));
v[nx][ny]=1;
}
}
}
}
}
}
printf("%d",cnt);
return 0;
}