864. 二维数组区块计数

864. 二维数组区块计数

输入一个只包含0和1的二维数组,上下左右和对角相邻的1组成一个区块,0不形成区块,求数组中的区块个数。

输入格式

第一行输入两个正整数N和M,N表示数组行数,M表示数组列数。

接下来N行,每行表示数组对应的一行,每行包含M个整数,整数之间用空格隔开。

输出格式

输出一个整数,表示数组中区块的个数。

数据范围

0≤N,M,N∗M≤1060≤N,M,N∗M≤106

输入样例:

3 3
0 1 0
1 0 0
1 0 1

输出样例:

2

样例解释

数组右下角的1单独构成一个区块,其他的3个1对角或上下相邻,构成另一个区块。

 

思路:

直接bfs,染色找。

代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define ll long long
const ll mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int maxn = 1e6+100;
int a[maxn];
bool vis[maxn];
int n, m;
int dx[8] = { 0,0,1,1,1,-1,-1,-1};
int dy[8] = { 1,-1,0,1,-1,0,-1,1};

struct node
{
	int x, y;
};
void bfs(int x, int y) {
	node st;
	st.x = x;st.y = y;
	queueQ;
	Q.push(st);
	while (!Q.empty()) {
		node u = Q.front();Q.pop();
		int id = u.x*m + u.y ;
		vis[id] = true;
		for (int i = 0;i < 8;++i) {
			int x = u.x + dx[i];
			int y = u.y + dy[i];
			int v_id = x*m + y;
			if (x >= 0 && x < n&&y >= 0 && y < m && 1 == a[v_id] && !vis[v_id]) {
				node v;
				v.x = x;
				v.y = y;
				Q.push(v);
			}
		}
	}
}
int main() {


	cin >> n >> m;

	for (int i = 0;i < n;++i) {
		for (int j = 0;j < m;++j) {
			scanf("%d",&a[i*m+j]);	
		}
	}

	int ret = 0;
	for (int i = 0;i < n;++i) {
		for (int j = 0;j < m;++j) {
			int id = i*m + j;
			if (a[id] == 1 && !vis[id]) {
				ret++;
				bfs(i, j);
			}
		}
	}
	cout << ret << endl;
	return 0;
}

 

你可能感兴趣的:(实习刷题)