聯通塊 隊列

連通塊

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