1097. 池塘计数 C++ FloodFill算法
发布日期:2021-05-08 02:33:18 浏览次数:39 分类:精选文章

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

为了解决这个问题,我们需要计算农夫约翰的土地中形成了多少片池塘。每个单元格如果是“W”则表示有水,否则是“.”。池塘是由相连的“W”单元格组成的,相连指的是上下左右和四个对角线方向,即八邻域。

方法思路

我们可以使用广度优先搜索(BFS)来解决这个问题。BFS适合处理这种寻找连通区域的问题,因为它可以逐层扩展地理区域,直到覆盖所有连通区域。具体步骤如下:

  • 读取输入:获取矩阵的尺寸n和m,以及矩阵本身。
  • 初始化计数器:用于记录找到多少片池塘。
  • 遍历矩阵:对于每一个单元格,如果是“W”且还未被访问过,就启动一次BFS。
  • BFS处理:从单元格开始,扩展到所有相连的“W”单元格,将它们标记为“.”,直到队列为空。
  • 解决代码

    #include 
    using namespace std;int n, m;char farm[n][m];int dx[8] = {1, 1, 1, 0, 0, -1, -1, -1};int dy[8] = {1, 0, -1, 1, -1, 1, 0, -1};void bfs(int x, int y) { queue
    > q; q.push({x, y}); while (!q.empty()) { auto current = q.front(); q.pop(); for (int i = 0; i < 8; ++i) { int nx = current.first + dx[i]; int ny = current.second + dy[i]; if (nx >= 0 && nx < n && ny >= 0 && ny < m) { if (farm[nx][ny] == 'W') { farm[nx][ny] = '.'; q.push({nx, ny}); } } } }}int main() { scanf("%d %d", &n, &m); for (int i = 0; i < n; ++i) { scanf("%s", farm[i]); } int count = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (farm[i][j] == 'W') { count++; bfs(i, j); } } } printf("%d", count); return 0;}

    代码解释

  • 读取输入:使用scanf读取矩阵的尺寸n和m,然后读取n行,每行m个字符,存储到二维数组farm中。
  • 遍历矩阵:双重循环遍历每一个单元格,如果是“W”,则启动BFS。
  • BFS处理:从当前单元格开始,检查八个方向。对于在矩阵范围内且是“W”的单元格,将其标记为“.”并加入队列,继续扩展。
  • 计数器更新:每次启动BFS时,计数器加一,最后输出计数器的值,即池塘的数量。
  • 这种方法确保了每个“W”单元格只被处理一次,时间复杂度为O(nm),适用于较大的矩阵。

    上一篇:Unity Shader之路(五)创建第一个顶点/片元着色器?
    下一篇:Unity Shader之路(四)Unity Shader的类型?

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年04月01日 06时25分31秒