連通塊
時間限制: 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;
}