求细胞数量(洛谷)

    科技2022-08-23  127

    题目描述 一矩形阵列由数字 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("", &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("", &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; }
    Processed: 0.037, SQL: 9