首页 > 其他分享 >洪水填充

洪水填充

时间:2024-09-08 12:46:25浏览次数:8  
标签:填充 洪水 int grid board col columns row

洪水填充

  • 设置路径信息进行剪枝和统计,类似感染的过程
  • 路径信息不撤销,可以保证每一片的感染过程能够区分开
  • 遍历次数和样本数量的规模一致

200. 岛屿数量

#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

class Solution {
public:
    int rows;
    int columns;

    void dfs(vector<vector<char>> &grid, int row, int col) {
        // 越界或者不是陆地就返回
        if (row < 0 || row >= rows
            || col < 0 || col >= columns
            || grid[row][col] != '1')
            return;
        // 标记这个陆地已经被处理过了
        grid[row][col] = 0;
        dfs(grid, row - 1, col);
        dfs(grid, row + 1, col);
        dfs(grid, row, col - 1);
        dfs(grid, row, col + 1);
    }

    int numIslands(vector<vector<char>> &grid) {
        rows = grid.size();
        columns = grid[0].size();
        int res = 0;

        // 遍历矩阵,对陆地进行 dfs,每次都会遍历这个陆地所在的岛屿
        for (int i = 0; i < rows; ++i) {
            for (int j = 0; j < columns; ++j) {
                if (grid[i][j] == '1') {
                    dfs(grid, i, j);
                    res++;
                }
            }
        }

        return res;
    }
};

130. 被围绕的区域

#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

class Solution {
public:
    int rows;
    int columns;

    bool isCoordinateLegal(int row, int col) {
        return row >= 0 && row < rows && col >= 0 && col < columns;
    }

    void convert2F(vector<vector<char>> &board, int row, int col) {
        // 越界或者不是字符 O,就返回
        if (!isCoordinateLegal(row, col) || board[row][col] != 'O') return;
        // 标记成字符 F,表示这片联通的字符 O 是不能被字符 X 完全包围的(有的 O 贴到边界了)
        board[row][col] = 'F';
        convert2F(board, row - 1, col);
        convert2F(board, row + 1, col);
        convert2F(board, row, col - 1);
        convert2F(board, row, col + 1);
    }

    void solve(vector<vector<char>> &board) {
        rows = board.size();
        columns = board[0].size();

        // 第一行和最后一行的 O,是无法被 X 包围的,先把他们所在的联通的 O 区域转换成 F
        for (int j = 0; j < columns; ++j) {
            if (board[0][j] == 'O') convert2F(board, 0, j);
            if (board[rows - 1][j] == 'O') convert2F(board, rows - 1, j);
        }

        // 第一列和最后一列的 O
        for (int i = 0; i < rows; ++i) {
            if (board[i][0] == 'O') convert2F(board, i, 0);
            if (board[i][columns - 1] == 'O') convert2F(board, i, columns - 1);
        }

        // 剩下的联通 O 都是可以被 X 包围的,转换成 X
        // F 是无法被包围的,再变回 O
        for (int i = 0; i < rows; ++i) {
            for (int j = 0; j < columns; ++j) {
                if (board[i][j] == 'O') board[i][j] = 'X';
                if (board[i][j] == 'F') board[i][j] = 'O';
            }
        }
    }
};

827. 最大人工岛

#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

class Solution {
public:
    int rows;
    int columns;

    bool isCoordinateLegal(int row, int col) {
        return row >= 0 && row < rows && col >= 0 && col < columns;
    }

    void dfs(vector<vector<int>> &grid, int row, int col, int id) {
        if (!isCoordinateLegal(row, col) || grid[row][col] != 1) return;
        // 标记上 id
        grid[row][col] = id;
        dfs(grid, row - 1, col, id);
        dfs(grid, row + 1, col, id);
        dfs(grid, row, col - 1, id);
        dfs(grid, row, col + 1, id);
    }

    int largestIsland(vector<vector<int>> &grid) {
        int id = 2;
        rows = grid.size();
        columns = grid[0].size();

        // 给不同的岛屿标记上不同 id
        for (int i = 0; i < rows; ++i)
            for (int j = 0; j < columns; ++j)
                if (grid[i][j] == 1)
                    dfs(grid, i, j, id++);

        // 统计每个岛屿大小
        vector<int> sizes(id, 0);
        // res 至少为最大的单独的岛屿大小
        int res = 0;
        for (int i = 0; i < rows; ++i) {
            for (int j = 0; j < columns; ++j) {
                if (grid[i][j] <= 1) continue;
                res = max(res, ++sizes[grid[i][j]]);
            }
        }

        vector<bool> visited(id, false);
        for (int i = 0; i < rows; ++i) {
            for (int j = 0; j < columns; ++j) {
                if (grid[i][j] != 0) continue;
                // 四周的岛屿,0 或者 大于 1
                int up = i > 0 ? grid[i - 1][j] : 0;
                int down = i + 1 < rows ? grid[i + 1][j] : 0;
                int left = j > 0 ? grid[i][j - 1] : 0;
                int right = j + 1 < columns ? grid[i][j + 1] : 0;

                visited[up] = true;
                int merge = 1 + sizes[up];
                if (!visited[down]) {
                    merge += sizes[down];
                    visited[down] = true;
                }
                if (!visited[left]) {
                    merge += sizes[left];
                    visited[left] = true;
                }
                if (!visited[right]) {
                    merge += sizes[right];
                    visited[right] = true;
                }
                res = max(res, merge);
                visited[up] = false;
                visited[down] = false;
                visited[left] = false;
                visited[right] = false;
            }
        }

        return res;
    }
};

803. 打砖块

#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

class Solution {
public:
    int rows;
    int columns;

    bool isCoordinateLegal(int row, int col) {
        return row >= 0 && row < rows && col >= 0 && col < columns;
    }

    // 返回转化了多少个砖块
    int convertTo2(vector<vector<int>> &grid, int row, int col) {
        if (!isCoordinateLegal(row, col) || grid[row][col] != 1) return 0;
        grid[row][col] = 2;
        return 1
               + convertTo2(grid, row - 1, col)
               + convertTo2(grid, row + 1, col)
               + convertTo2(grid, row, col - 1)
               + convertTo2(grid, row, col + 1);
    }

    // 判断上下左右是否和标记为 2 的砖块相连
    bool connectTo2(vector<vector<int>> &grid, int row, int col) {
        return (row > 0 && grid[row - 1][col] == 2)
               || (row + 1 < rows && grid[row + 1][col] == 2)
               || (col > 0 && grid[row][col - 1] == 2)
               || (col + 1 < columns && grid[row][col + 1] == 2);
    }

    vector<int> hitBricks(vector<vector<int>> &grid, vector<vector<int>> &hits) {
        rows = grid.size();
        columns = grid[0].size();

        // 依次打出炮弹
        for (auto &hit: hits)
            grid[hit[0]][hit[1]]--;

        // 把打出所有炮弹后仍然和天花板连在一起的连通区域标记成 2
        for (int j = 0; j < columns; ++j)
            convertTo2(grid, 0, j);

        vector<int> res(hits.size(), 0);
        // 倒过来恢复被炮弹打过的地方
        for (int i = hits.size() - 1; i >= 0; i--) {
            int x = hits[i][0];
            int col = hits[i][1];
            grid[x][col]++;
            // 原本炮弹就打空了,不会致使相连的砖块掉落
            if (grid[x][col] <= 0) continue;
            // grid[x][col] 为 1,判断是否与标记成 2 的砖块相连,或者他本身就在天花板最上面
            if (connectTo2(grid, x, col) || x == 0)
                // 除去自身,剩下的才是导致掉下去的砖块
                res[i] = convertTo2(grid, x, col) - 1;
        }
        return res;
    }
};

标签:填充,洪水,int,grid,board,col,columns,row
From: https://www.cnblogs.com/sprinining/p/18402764

相关文章

  • # 结构体成员定义的顺序也会影响结构体的大小,内存对齐,内存填充
    结构体成员定义的顺序也会影响结构体的大小,内存对齐,内存填充usingSystem;usingSystem.Runtime.InteropServices;structStrcutOne{publicintb;//4bytespublicbytea;//1publicbytec;//1//4+1+1+2(在填充两个2个字节)=8字节}struct......
  • 数据处理与数据填充在Pandas中的应用
    在数据分析和机器学习项目中,数据处理是至关重要的一步。Pandas作为Python中用于数据分析和操作的一个强大库,提供了丰富的功能来处理和清洗数据。本文将深入探讨Pandas在数据处理,特别是数据填充方面的应用。在实际的数据集中,缺失值(MissingValues)或异常值(Outliers)是常见的问题......
  • canvas版本的俄罗斯方块,少一个全行填充消除,有兴趣再加,俄罗斯方块还是复杂一些
    代码:<!Doctypehtml><htmllang="zh_cn"><head><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><title>俄罗斯方块</title><metaname="Ke......
  • cad.net 该死的填充
    捕捉点卡顿cad现在采用了一种密集填充就不显示的策略.系统变量hpmaxlines:默认值100000(十万).其实挺傻的,我们无论何时都要看到填充啊.不然我怎么删掉密集填充呢?不然我还以为没有填充再填充一次呢~它卡顿是发生在画图期间,鼠标经过填充区域密集计算交点,端点...密集计算长......
  • 泰坦尼克号 - 从灾难中学习机器学习/Titanic - Machine Learning from Disaster(kaggle
    此次目的:hello大家好,俺是没事爱瞎捣鼓又分享欲爆棚的叶同学!!!准备出几期博客来记录我学习kaggle数据科学入门竞赛的过程,顺便也将其中所学习到的知识分享出来。(所学主要的内容来自与b站大学恩师“编程教学-Python“的教学视频内容)哎!前几天,俺还在享受快乐生活嘞,几天就到学校了!痛......
  • ImageDraw.Draw 填充区域
    ImageDraw.Draw填充区域在Python的PIL(PythonImagingLibrary,现在通常称为Pillow)库中,ImageDraw.Draw 对象用于在图像上绘制形状。要填充一个区域,你通常会使用 rectangle、ellipse、polygon 等方法,并指定填充颜色。以下是一个使用 ImageDraw.Draw 填充矩形的例子: from......
  • Cesium 展示——动态洪水淹没效果
    文章目录需求分析1.引入插件2.定义变量3.开始绘制3.1绘制点3.2绘制线3.3绘制面3.4开始分析(第一种)3.5开始分析(第二种)3.6方法调用4.整体代码其他需求从低处到高处实现洪水淹没效果分析本篇文章对方法进行单独抽离,因此支持......
  • 使用 Tampermonkey5.1.1_0加自定义编写的js脚本实现自动填充表单
    最近有碰到要使用单点登录的需求,最开始是按照固定流程使用OAuth2.0或者jwt等技术通过父子系统交互的方式实现单点登录。缺点:代码繁琐,而且需要子系统配合提供单点登录接口,并且跳转时子系统需要携带其token等参数优点:安全,通过系统交互的方式鉴权访问接口。由于要集成的子系统很多,而......
  • 实现 公共字段自动填充【创建时间/创建人/修改id/修改id】
    实现公共字段自动填充【创建时间/创建人/修改id/修改id】技术栈枚举自定义注解AOP反射实现思路编写枚举,用于标识数据库操作类型自定义注解AutoFill,用于标识需要进行公共字段自动填充的方法将Mapper的方法名写成常量类,提高代码规范自定义切面类AutoFillAspect,统一拦......
  • 原生js实现下滑到当前模块进度条填充
    <divstyle="height:1500px;"></div><divclass="progress-container"><divclass="progress-bar"data-progress="90%"><pclass="progress-text">GoogleAds在Google搜索引擎上覆盖超过90%......