求细胞数量

2025.9.13

题目内容

一矩形阵列由数字 \(0\)\(9\) 组成,数字 \(1\)\(9\) 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数

输入描述

第一行两个整数代表矩阵大小 \(n\)\(m\)

接下来 \(n\) 行,每行一个长度为 \(m\) 的只含字符 09 的字符串,代表这个 \(n \times m\) 的矩阵

输出描述

一行一个整数代表细胞个数

输入输出样例

输入

4 10
0234500067
1034560500
2045600671
0000000089

输出

4

说明/提示

对于 \(100\%\) 的数据,保证 \(1 \le n,m \le 100\)

C++实现(BFS版)

#include <bits/stdc++.h>
using namespace std;

int n, m;
vector<string> grid;
bool visited[105][105];

// 方向:上下左右
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};

void bfs(int x, int y) {
    queue<pair<int,int>> q;
    q.push({x, y});
    visited[x][y] = true;

    while (!q.empty()) {
        auto [cx, cy] = q.front();
        q.pop();
        for (int i = 0; i < 4; i++) {
            int nx = cx + dx[i];
            int ny = cy + dy[i];
            if (nx >= 0 && nx < n && ny >= 0 && ny < m) {
                if (!visited[nx][ny] && grid[nx][ny] != '0') {
                    visited[nx][ny] = true;
                    q.push({nx, ny});
                }
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> m;
    grid.resize(n);
    for (int i = 0; i < n; i++) {
        cin >> grid[i];
    }

    int count = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (!visited[i][j] && grid[i][j] != '0') {
                count++;
                bfs(i, j);
            }
        }
    }

    cout << count << "\n";
    return 0;
}

C++实现(DFS版)

#include <bits/stdc++.h>
using namespace std;

int n, m;
vector<string> grid;
bool visited[105][105];

// 方向:上下左右
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};

void dfs(int x, int y) {
    visited[x][y] = true;
    for (int i = 0; i < 4; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if (nx >= 0 && nx < n && ny >= 0 && ny < m) {
            if (!visited[nx][ny] && grid[nx][ny] != '0') {
                dfs(nx, ny);
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> m;
    grid.resize(n);
    for (int i = 0; i < n; i++) {
        cin >> grid[i];
    }

    int count = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (!visited[i][j] && grid[i][j] != '0') {
                count++;
                dfs(i, j);
            }
        }
    }

    cout << count << "\n";
    return 0;
}

posted @ 2025-09-13 20:31  安度因小王子  阅读(14)  评论(0)    收藏  举报