博客
关于我
65.广搜练习:细胞数目
阅读量:798 次
发布时间:2023-04-04

本文共 2098 字,大约阅读时间需要 6 分钟。

为了解决这个问题,我们需要计算给定矩阵中的细胞个数。细胞由数字1到9组成,相邻的数字(上下左右)属于同一个细胞。我们可以使用广度优先搜索(BFS)来遍历矩阵,标记访问过的细胞,避免重复计算。

方法思路

  • 输入处理:读取矩阵的行数和列数,并将每个字符转换为对应的数字,存储在二维数组中。
  • 访问标记:创建一个同样大小的二维数组来记录每个单元格是否已经被访问过。
  • BFS遍历:对于每个未被访问过的1,启动BFS,将所有连通的1标记为已访问,并计数加一。
  • 队列处理:在BFS中,使用队列来逐层扩展,处理四个方向(上、下、左、右)的单元格,确保每个单元格只被访问一次。
  • 解决代码

    #include 
    #include
    #include
    using namespace std;
    int m, n;
    int jz[1001][1001];
    bool visited[1001][1001];
    int sum = 0;
    queue
    > q;
    void input() {
    cin >> m >> n;
    for (int i = 1; i <= m; ++i) {
    string s;
    cin >> s;
    for (int j = 1; j <= n; ++j) {
    jz[i][j] = s[j-1] - '0';
    if (jz[i][j] != 0) {
    visited[i][j] = false;
    } else {
    visited[i][j] = false;
    }
    }
    }
    }
    void bfs(int i, int j) {
    if (i < 1 || i > m || j < 1 || j > n) {
    return;
    }
    if (jz[i][j] != 1) {
    return;
    }
    if (visited[i][j]) {
    return;
    }
    visited[i][j] = true;
    q.push({i, j});
    sum++;
    int dx[] = {-1, 1, 0, 0};
    int dy[] = {0, 0, -1, 1};
    while (!q.empty()) {
    auto current = q.front();
    q.pop();
    int x = current.first;
    int y = current.second;
    for (int d = 0; d < 4; ++d) {
    int nx = x + dx[d];
    int ny = y + dy[d];
    if (nx >= 1 && nx <= m && ny >= 1 && ny <= n) {
    if (jz[nx][ny] == 1 && !visited[nx][ny]) {
    visited[nx][ny] = true;
    q.push({nx, ny});
    }
    }
    }
    }
    }
    int main() {
    input();
    for (int i = 1; i <= m; ++i) {
    for (int j = 1; j <= n; ++j) {
    if (jz[i][j] == 1 && !visited[i][j]) {
    bfs(i, j);
    }
    }
    }
    cout << sum << endl;
    return 0;
    }

    代码解释

  • 输入处理:读取矩阵的行数和列数,然后读取每一行字符串并转换为数字,存储在二维数组jz中。
  • 访问标记数组visited数组记录每个单元格是否已被访问。
  • BFS函数:对于每个未被访问过的1,启动BFS,标记所有连通的1,并使用队列处理四个方向的单元格,直到队列为空。
  • 主函数:遍历矩阵,启动BFS处理每个未被访问的1,最后输出计数器的值。
  • 该方法使用BFS高效地遍历矩阵,确保每个单元格只被访问一次,时间复杂度为O(mn),适用于较大的矩阵。

    转载地址:http://inrfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现拉格朗日插值算法(附完整源码)
    查看>>
    Objective-C实现拓扑排序算法(附完整源码)
    查看>>
    Objective-C实现拦截输入法(附完整源码)
    查看>>
    Objective-C实现括号匹配(附完整源码)
    查看>>
    Objective-C实现拷贝二进制文件(附完整源码)
    查看>>
    Objective-C实现指定内存空间获取时间的函数(附完整源码)
    查看>>
    Objective-C实现指定点 x 处计算多项式 f(x) 并返回值算法(附完整源码)
    查看>>
    Objective-C实现按位倒序(附完整源码)
    查看>>
    Objective-C实现按位的isPowerOfTwo算法(附完整源码)
    查看>>
    Objective-C实现按位运算符乘以无符号数multiplyUnsigned算法(附完整源码)
    查看>>
    Objective-C实现排队叫号系统(附完整源码)
    查看>>
    Objective-C实现控制NRP8S功率计读取功率 (附完整源码)
    查看>>
    Objective-C实现控制程控电源2306读取电流 (附完整源码)
    查看>>
    Objective-C实现摄氏温度和华氏温度互转(附完整源码)
    查看>>
    Objective-C实现播放器(附完整源码)
    查看>>
    Objective-C实现操作MySQL(附完整源码)
    查看>>
    Objective-C实现操作注册表 (附完整源码)
    查看>>
    Objective-C实现攀登 n 级楼梯的不同方式算法(附完整源码)
    查看>>
    Objective-C实现改变图片亮度算法(附完整源码)
    查看>>
    Objective-C实现数乘以二multiplyByTwo算法(附完整源码)
    查看>>