博客
关于我
Lake Counting
阅读量:802 次
发布时间:2023-01-30

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

为了计算农场中的池塘数量,我们可以使用广度优先搜索(BFS)来探索每个连通区域。以下是详细的步骤和代码实现。

方法思路

  • 读取输入:首先读取输入,获取矩阵的大小N和M,然后读取N行的数据,存储到二维数组中。
  • 初始化已访问数组:为了跟踪哪些格子已经被访问,我们创建一个与二维数组同样大小的布尔数组visited
  • 遍历矩阵:对每一个格子,检查是否是水('W')且未被访问过。如果是,则进行BFS,将所有连通的水格子标记为已访问,并计数加一。
  • 广度优先搜索(BFS):BFS使用队列来逐层扩展,处理当前节点及其相邻节点。如果邻居是未被访问的水格子,则加入队列并标记为已访问。
  • 返回结果:当所有未被访问的水格子都被处理完毕,返回池塘的总数。
  • 解决代码

    #include 
    #include
    using namespace std;int main() { int n, m; scanf("%d %d", &n, &m); char grid[n][m]; for (int i = 0; i < n; ++i) { scanf("%s", grid[i]); } bool visited[n][m] = {false}; int count = 0; //八个方向的移动方向 int dirs[8][2] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}}; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (grid[i][j] == 'W' && !visited[i][j]) { //启动BFS queue
    > q; q.push({i, j}); visited[i][j] = true; while (!q.empty()) { pair
    current = q.front(); q.pop(); for (auto dir : dirs) { int ni = current.first + dir[0]; int nj = current.second + dir[1]; if (ni >= 0 && ni < n && nj >= 0 && nj < m) { if (!visited[ni][nj] && grid[ni][nj] == 'W') { visited[ni][nj] = true; q.push({ni, nj}); } } } } count++; } } } cout << count << endl; return 0;}

    代码解释

  • 读取输入:使用scanf读取N和M的值,然后读取每一行作为grid二维数组的行。
  • 初始化可访问性数组visited数组用于记录每个格子是否已被访问。
  • 遍历矩阵:双重循环遍历每个格子。对于未被访问的水格子,启动BFS。
  • BFS队列处理:使用队列逐个处理当前格子,检查八个方向的邻居。如果邻居是水且未被访问,就标记并加入队列。
  • 计数池塘:每个启动的BFS对应一个池塘,计数加一。计算完成后输出池塘数量。
  • 这种方法确保了每个水池只被计数一次,效率较高,适用于给定的矩阵尺寸。

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

    你可能感兴趣的文章
    MYSQL 幻读(Phantom Problem)不可重复读
    查看>>
    mysql 往字段后面加字符串
    查看>>
    mysql 快照读 幻读_innodb当前读 与 快照读 and rr级别是否真正避免了幻读
    查看>>
    MySQL 快速创建千万级测试数据
    查看>>
    mysql 快速自增假数据, 新增假数据,mysql自增假数据
    查看>>
    MySql 手动执行主从备份
    查看>>
    Mysql 批量修改四种方式效率对比(一)
    查看>>
    Mysql 报错 Field 'id' doesn't have a default value
    查看>>
    MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
    查看>>
    Mysql 拼接多个字段作为查询条件查询方法
    查看>>
    mysql 排序id_mysql如何按特定id排序
    查看>>
    Mysql 提示:Communication link failure
    查看>>
    mysql 插入是否成功_PDO mysql:如何知道插入是否成功
    查看>>
    Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
    查看>>
    mysql 数据库中 count(*),count(1),count(列名)区别和效率问题
    查看>>
    mysql 数据库备份及ibdata1的瘦身
    查看>>
    MySQL 数据库备份种类以及常用备份工具汇总
    查看>>
    mysql 数据库存储引擎怎么选择?快来看看性能测试吧
    查看>>
    MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作
    查看>>
    MySQL 数据库的高可用性分析
    查看>>