求细胞数量(洛谷)

题目描述
一矩形阵列由数字 0 到 9 组成,数字 1 到 9 代表细胞,

细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。

输入格式
第一行两个整数代表矩阵大小 n 和 m。
接下来 n 行,每行一个长度为 m 的只含字符 0 到 9 的字符串,代表这个 n×m 的矩阵。

输出格式
一行一个整数代表细胞个数。

输入样例
4 10
0234500067
1034560500
2045600671
0000000089

输出样例
4

数据范围
对于 100% 的数据,保证 1 ≤ n, m ≤ 100。


题解一
DFS:

#include <iostream>
#include <cstdio> 
using namespace std;

const int N = 110;

int n, m;
int g[N][N];
bool st[N][N];

int dx[4] = {
    
    -1, 0, 1, 0};
int dy[4] = {
    
    0, 1, 0, -1};

void dfs(int x, int y)
{
    
    
	st[x][y] = true;
	for (int i = 0; i < 4; i ++)
	{
    
    
		int a = x + dx[i], b = y + dy[i];
		if(a < 1 || a > n || b < 1 || b > m) continue;
		if(g[a][b] == 0 || st[a][b]) continue;
		
		dfs(a, b);
	}
}

int main()
{
    
    
	cin >> n >> m;
	
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++)
			scanf("%1d", &g[i][j]);
		
	int ans = 0;			
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++)
			if(g[i][j] != 0 && !st[i][j])
			{
    
    
				ans ++;
				dfs(i, j);
			}		
			
	cout << ans << endl;
	return 0;		
}

题解二
BFS:

#include <iostream>
#include <cstdio>
#include <queue> 

#define x first
#define y second
using namespace std;

const int N = 110;

typedef pair<int, int> PII;

int n, m;
int g[N][N];
bool st[N][N];

int dx[4] = {
    
    -1, 0, 1, 0};
int dy[4] = {
    
    0, 1, 0, -1};

void bfs(int x, int y)
{
    
    
	queue<PII> q;
	q.push(make_pair(x, y));
	st[x][y] = true;
	
	while(q.size())
	{
    
    
		PII t = q.front();
		q.pop();
		
		for (int i = 0; i < 4; i ++)
		{
    
    
			int a = t.x + dx[i], b = t.y + dy[i];
			if(a < 1 || a > n || b < 1 || b > m) continue;
			if(g[a][b] == 0 || st[a][b]) continue;
			
			q.push(make_pair(a, b));
			st[a][b] = true;
		}
	}
}

int main()
{
    
    
	cin >> n >> m;
	
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++)
			scanf("%1d", &g[i][j]);
		
	int ans = 0;			
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++)
			if(g[i][j] != 0 && !st[i][j])
			{
    
    
				ans ++;
				bfs(i, j);
			}		
			
	cout << ans << endl;
	return 0;		
}

猜你喜欢

转载自blog.csdn.net/weixin_46239370/article/details/108931466
今日推荐