当前位置: 首页 > news >正文

floodfill算法

目录

什么是floodfill算法

题目一——733. 图像渲染 - 力扣(LeetCode)

题目二——200. 岛屿数量 - 力扣(LeetCode) 

题目三——695. 岛屿的最大面积 - 力扣(LeetCode) 

题目四—— 130. 被围绕的区域 - 力扣(LeetCode)

题目五——417. 太平洋大西洋水流问题 - 力扣(LeetCode)

题目六——529. 扫雷游戏 - 力扣(LeetCode) 

题目七——LCR 130. 衣橱整理 - 力扣(LeetCode)


 

什么是floodfill算法

啥是 FloodFill 算法呢,最直接的一个应用就是「颜色填充」,就是 Windows 绘画本中那个小油漆桶的标志,可以把一块被圈起来的区域全部染色。

这种算法思想还在许多其他地方有应用。比如说扫雷游戏,有时候你点一个方格,会一下子展开一片区域,这个展开过程,就是 FloodFill 算法实现的。

类似的,像消消乐这类游戏,相同方块积累到一定数量,就全部消除,也是 FloodFill 算法的功劳。

通过以上的几个例子,你应该对 FloodFill 算法有个概念了,现在我们要抽象问题,提取共同点。

实现这个FloodFill算法,其实有两种实现方式

  1. DFS
  2. BFS

我们这篇文章只讲解DFS里面的

题目一——733. 图像渲染 - 力扣(LeetCode)

 

这个题目很容易懂吧!!其实我们只需要从题目给的那个起始位置开始调用dfs。每遍历一个,我们就将它的颜色改成

class Solution {
public:// 定义四个方向的移动向量,用于上下左右四个方向的遍历int dx[4]={0,0,-1,1}; // x方向上的移动:-1(左),1(右),0(不变)int dy[4]={1,-1,0,0}; // y方向上的移动:1(上),-1(下),0(不变)// 深度优先搜索函数,用于将指定起始点的相连区域的颜色更改为目标颜色void dfs(vector<vector<int>>& image, int i, int j, int origincolor, int tar_color){// 将当前点的颜色更改为目标颜色image[i][j] = tar_color;// 遍历四个方向for(int k=0; k<4; k++){int x = i + dx[k], y = j + dy[k]; // 计算相邻点的坐标// 检查相邻点是否在图像范围内且颜色与起始颜色相同if(x >= 0 && x < image.size() && y >= 0 && y < image[0].size()&& image[x][y] == origincolor){// 如果满足条件,则递归地对相邻点进行深度优先搜索dfs(image, x, y, origincolor, tar_color);}}}// 图像渲染(洪水填充)的主函数vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {// 如果起始点的颜色已经等于目标颜色,则无需更改,直接返回原图像if(image[sr][sc] == color) return image;// 调用深度优先搜索函数,从起始点开始,将相连区域的颜色更改为目标颜色dfs(image, sr, sc, image[sr][sc], color);// 返回渲染后的图像return image;}
};

题目二——200. 岛屿数量 - 力扣(LeetCode) 

其实,我们之前做了那么多回溯的题目了,我相信大家都会做这一道。

我们很快就能写出代码,但是我们要考虑一点:我们怎么判断我们走过了哪些点啊?

有两种方法

  1. 我们可以修改我们遍历过的点——即将我们遍历过的点设置为'2'
  2. 我们也可以使用一个和原数组等大的bool数组,来记录我们走过的点

修改我们遍历过的点

class Solution {
public:// 定义四个方向的移动:上、下、左、右// dx数组表示在x方向上的移动,dy数组表示在y方向上的移动int dx[4]={0,0,-1,1}; // x方向上的移动:-1(左),1(右),0(上/下时不变)int dy[4]={1,-1,0,0}; // y方向上的移动:1(上),-1(下),0(左/右时不变)// 深度优先搜索函数,用于遍历并标记所有相连的'1'为'2'void dfs(vector<vector<char>>& grid, int i, int j) {// 将当前位置标记为已访问过('2')grid[i][j] = '2';// 遍历四个方向for (int k = 0; k < 4; k++) {// 计算新位置的坐标int x = i + dx[k], y = j + dy[k];// 检查新位置是否在网格内且为'1'(未访问过的岛屿部分)if (x >= 0 && x < grid.size() && y >= 0 && y < grid[0].size()&& grid[x][y] == '1') {// 如果是,则递归访问该位置dfs(grid, x, y);}}}// 计算岛屿数量的函数int numIslands(vector<vector<char>>& grid) {int ret = 0; // 记录岛屿数量// 遍历整个网格for (int n = 0; n < grid.size(); n++) {for (int i = 0; i < grid[0].size(); i++) {// 如果当前位置是'1'(岛屿的起始点)if (grid[n][i] == '1') {// 调用dfs函数遍历并标记这个岛屿的所有部分dfs(grid, n, i);// 岛屿数量加一ret++;}}}// 返回岛屿的总数量return ret;}
};

使用bool数组版本 

class Solution {
public:// 用于记录网格中每个位置是否已被访问过的二维数组bool check[301][301]={false}; // 假设网格的大小不会超过300x300// 定义四个方向的移动:上、下、左、右// dx数组表示在x方向上的移动,dy数组表示在y方向上的移动int dx[4] = {0, 0, -1, 1}; // x方向上的移动:-1(左),1(右),0(上/下时不变,但在这里主要用于配合dy进行方向移动)int dy[4] = {1, -1, 0, 0}; // y方向上的移动:1(上),-1(下),0(左/右时不变,但在这里主要用于配合dx进行方向移动)// 深度优先搜索函数,用于遍历并标记所有相连的'1'为已访问(虽然实际上并未改变grid中的值,但使用了check数组来记录)void dfs(vector<vector<char>>& grid, int i, int j) {// 将当前位置标记为已访问过check[i][j] = true;// 遍历四个方向for (int k = 0; k < 4; k++) {// 计算新位置的坐标int x = i + dx[k], y = j + dy[k];// 检查新位置是否在网格内、是否为'1'且未被访问过if (x >= 0 && x < grid.size() && y >= 0 && y < grid[0].size()&& grid[x][y] == '1' && check[x][y] == false) {// 如果是,则递归访问该位置dfs(grid, x, y);}}}// 计算岛屿数量的函数int numIslands(vector<vector<char>>& grid) {int ret = 0; // 记录岛屿数量// 遍历整个网格for (int n = 0; n < grid.size(); n++) {for (int i = 0; i < grid[0].size(); i++) {// 如果当前位置是'1'且未被访问过(即是一个新岛屿的起点)if (grid[n][i] == '1' && check[n][i] == false) {// 调用dfs函数遍历并标记这个岛屿的所有部分dfs(grid, n, i);// 岛屿数量加一ret++;}}}// 返回岛屿的总数量return ret;}
};

 

题目三——695. 岛屿的最大面积 - 力扣(LeetCode) 

 

 和上题简直一模一样。我们还是考虑一个东西

我们很快就能写出代码,但是我们要考虑一点:我们怎么判断我们走过了哪些点啊?

有两种方法

  1. 我们可以修改我们遍历过的点——即将我们遍历过的点设置为2
  2. 我们也可以使用一个和原数组等大的bool数组,来记录我们走过的点

修改原数组版本

class Solution {
public:// 定义四个方向的移动:上、下、左、右// dx数组表示在x方向上的移动,dy数组表示在y方向上的移动int dx[4] = {0, 0, -1, 1}; // x方向上的移动:-1(左),1(右),0(上/下时不变,但在这里主要用于配合dy进行方向移动)int dy[4] = {1, -1, 0, 0}; // y方向上的移动:1(上),-1(下),0(左/右时不变,但在这里主要用于配合dx进行方向移动)int path;void dfs(vector<vector<int>>&grid,int i,int j){grid[i][j]=2;path++;for(int k=0;k<4;k++){int x = i + dx[k], y = j + dy[k];if (x >= 0 && x < grid.size() && y >= 0 && y < grid[0].size()&& grid[x][y] == 1) {dfs(grid,x,y);       }}}int maxAreaOfIsland(vector<vector<int>>& grid) {int ret=0;for(int n=0;n<grid.size();n++){for(int i=0;i<grid[0].size();i++){if(grid[n][i]==1){path=0;dfs(grid,n,i);ret=max(path,ret);}}}return ret;}
};

 使用bool数组版本

class Solution {
public:// 定义四个方向的移动:上、下、左、右// dx数组表示在x方向上的移动,dy数组表示在y方向上的移动int dx[4] = {0, 0, -1, 1}; // x方向上的移动:-1(左),1(右),0(上/下时不变,但在这里主要用于配合dy进行方向移动)int dy[4] = {1, -1, 0, 0}; // y方向上的移动:1(上),-1(下),0(左/右时不变,但在这里主要用于配合dx进行方向移动)int path;bool check[51][51]={false};void dfs(vector<vector<int>>&grid,int i,int j){check[i][j]=true;path++;for(int k=0;k<4;k++){int x = i + dx[k], y = j + dy[k];if (x >= 0 && x < grid.size() && y >= 0 && y < grid[0].size()&& grid[x][y] == 1&&check[x][y]==false) {dfs(grid,x,y);       }}}int maxAreaOfIsland(vector<vector<int>>& grid) {int ret=0;for(int n=0;n<grid.size();n++){for(int i=0;i<grid[0].size();i++){if(grid[n][i]==1&&check[n][i]==false){check[n][i]=true;path=0;dfs(grid,n,i);ret=max(path,ret);}}}return ret;}
};

 

题目四—— 130. 被围绕的区域 - 力扣(LeetCode)

 

 

 这道题相比于之前的floodfill算法题还是有一点难度的。

如果我们直接做是特别麻烦的,所以我们需要转换一下思维——正难则反

我们不去直接修改里面的'O',我们先修改外围的‘O',剩下的'O'就是我们要修改的

  1. 我们先处理边界的o,遇到一个o就设置成'.',然后调用dfs寻找和它相连的o
  2. 现在数组里面就只剩下'x','.','o'了        
  3. 最后我们将'.'还原成'x',把'o'修改成'x'

我们就很快就能写出下面这个代码

class Solution {
public:// 定义四个方向上的行列偏移量,用于DFS遍历int dx[4] = {1, -1, 0, 0}; // 右、左、下、上int dy[4] = {0, 0, 1, -1};// 深度优先搜索函数,用于将与边界上的'O'相连的所有'O'标记为'.'void dfs(vector<vector<char>>& board, int i, int j) {board[i][j] = '.'; // 将当前'O'标记为'.',表示已访问for (int k = 0; k < 4; k++) { // 遍历四个方向int x = i + dx[k], y = j + dy[k]; // 计算新坐标// 检查新坐标是否越界,且新位置的字符是否为'O'if (x >= 0 && x < board.size() && y >= 0 && y < board[0].size() && board[x][y] == 'O') {dfs(board, x, y); // 递归调用,继续DFS}}}// 主函数,用于执行整个棋盘的处理void solve(vector<vector<char>>& board) {int m = board.size(), n = board[0].size(); // 获取棋盘的行数和列数// 第一步:把边界的'O'相连的联通块,全部修改成'.'// 遍历棋盘的四个边界,使用DFS将与边界上的'O'相连的所有'O'标记为'.'for (int j = 0; j < n; j++) { // 遍历第一行和最后一行if (board[0][j] == 'O') dfs(board, 0, j); // 第一行if (board[m - 1][j] == 'O') dfs(board, m - 1, j); // 最后一行}for (int i = 0; i < m; i++) { // 遍历第一列和最后一列if (board[i][0] == 'O') dfs(board, i, 0); // 第一列if (board[i][n - 1] == 'O') dfs(board, i, n - 1); // 最后一列}// 第二步:还原// 将标记为'.'的字符还原为'O',表示这些'O'与边界相连;将未标记的'O'转换为'X',表示这些'O'是孤立的for (int i = 0; i < m; i++)for (int j = 0; j < n; j++) {if (board[i][j] == '.') board[i][j] = 'O'; // 还原与边界相连的'O'else if (board[i][j] == 'O') board[i][j] = 'X'; // 将孤立的'O'转换为'X'}}
};

题目五——417. 太平洋大西洋水流问题 - 力扣(LeetCode)

 

 

  看起来好恶心啊,题目都没有看懂啊。

正难则反。

如果直接去判断某⼀个位置是否既能到⼤西洋也能到太平洋,会重复遍历很多路径。

  1. 我们反着来,从⼤西洋沿岸开始反向 dfs ,这样就能找出那些点可以流向⼤西洋;
  2. 同理,从太平洋沿 岸也反向 dfs ,这样就能找出那些点可以流向太平洋。
  3. 那么,被标记两次的点,就是我们要找的结 果。

 

class Solution {int m, n; // 用于存储矩阵的行数和列数int dx[4] = {0, 0, 1, -1}; // 定义四个方向的x偏移量,用于上下左右移动int dy[4] = {1, -1, 0, 0}; // 定义四个方向的y偏移量,用于上下左右移动public:// 主函数,用于找到可以从太平洋和大西洋到达的陆地单元格vector<vector<int>> pacificAtlantic(vector<vector<int>>& h) {m = h.size(), n = h[0].size(); // 初始化行数和列数vector<vector<bool>> pac(m, vector<bool>(n, false)); // 标记可以从太平洋到达的单元格vector<vector<bool>> atl(m, vector<bool>(n, false)); // 标记可以从大西洋到达的单元格// 1. 先处理太平洋方向,从边界开始深度优先搜索for (int j = 0; j < n; j++) dfs(h, 0, j, pac); // 从第一行的每个单元格开始搜索for (int i = 0; i < m; i++) dfs(h, i, 0, pac); // 从第一列的每个单元格开始搜索// 2. 处理大西洋方向,从边界开始深度优先搜索for (int i = 0; i < m; i++) dfs(h, i, n - 1, atl); // 从最后一行的每个单元格开始搜索for (int j = 0; j < n; j++) dfs(h, m - 1, j, atl); // 从最后一列的每个单元格开始搜索vector<vector<int>> ret; // 存储结果,即可以同时从太平洋和大西洋到达的单元格坐标// 遍历每个单元格,检查是否同时被pac和atl标记为可达for (int i = 0; i < m; i++)for (int j = 0; j < n; j++)if (pac[i][j] && atl[i][j])ret.push_back({i, j}); // 如果可以同时从两边到达,则加入结果集return ret; // 返回结果}// 深度优先搜索函数,用于标记可以从给定起点到达的所有单元格void dfs(vector<vector<int>>& h, int i, int j, vector<vector<bool>>& check) {check[i][j] = true; // 标记当前单元格为可达for (int k = 0; k < 4; k++) { // 遍历四个方向int x = i + dx[k], y = j + dy[k]; // 计算新坐标// 检查新坐标是否在矩阵范围内,是否未被访问过,且高度不小于当前单元格if (x >= 0 && x < m && y >= 0 && y < n && check[x][y] == false && h[x][y] >= h[i][j]) {dfs(h, x, y, check); // 递归调用,继续搜索}}}
};

题目六——529. 扫雷游戏 - 力扣(LeetCode) 

 

 

 这个题目就是吓你,但是其实非常简单的

class Solution 
{int dx[8] = {0, 0, 1, -1, 1, 1, -1, -1}; // 八个方向的x偏移量,用于八个方向的移动(上下左右及四个对角线方向)int dy[8] = {1, -1, 0, 0, 1, -1, -1, 1}; // 八个方向的y偏移量,用于八个方向的移动(上下左右及四个对角线方向)int m, n; // 矩阵的行数和列数public:// 更新地雷板的主函数vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {m = board.size(); // 获取行数n = board[0].size(); // 获取列数int x = click[0], y = click[1]; // 获取点击位置的坐标// 如果直接点到地雷if(board[x][y] == 'M') {board[x][y] = 'X'; // 将地雷标记为'X'表示已点击return board; // 返回更新后的板}// 从点击位置开始进行深度优先搜索dfs(board, x, y);return board; // 返回更新后的板}// 深度优先搜索函数void dfs(vector<vector<char>>& board, int i, int j){// 统计一下周围的地雷个数int count = 0;for(int k = 0; k < 8; k++) // 遍历八个方向{int x = i + dx[k], y = j + dy[k]; // 计算新坐标// 如果新坐标在矩阵范围内且对应位置是地雷if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'M'){count++; // 地雷计数加一}}// 如果周围有地雷if(count > 0) {board[i][j] = count + '0'; // 将当前位置标记为周围地雷的数量(字符形式)return; // 结束当前搜索}else // 如果周围没有地雷{board[i][j] = 'B'; // 将当前位置标记为'B',表示是安全的空地// 继续搜索周围未探索过的空地(标记为'E'的位置)for(int k = 0; k < 8; k++){int x = i + dx[k], y = j + dy[k];// 如果新坐标在矩阵范围内且对应位置是未探索过的空地('E')if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'E'){dfs(board, x, y); // 递归调用,继续搜索}}}}
};

题目七——LCR 130. 衣橱整理 - 力扣(LeetCode)

 

class Solution {
public:int m, n, k; // 矩阵的行数m、列数n和给定的和限制kbool vis[101][101]; // 访问标记数组,用于记录哪些位置已经被访问过int ret; // 结果变量,用于记录满足条件的路径数量(或深度优先搜索的访问次数等,具体含义取决于dfs函数的实现)int dx[4] = {0, 0, -1, 1}; // 四个方向的x偏移量,用于上下左右移动int dy[4] = {1, -1, 0, 0}; // 四个方向的y偏移量,用于上下左右移动int wardrobeFinishing(int _m, int _n, int _k) {m = _m, n = _n, k = _k; // 初始化矩阵大小和和限制dfs(0, 0); // 从(0, 0)位置开始进行深度优先搜索return ret; // 返回结果}// 深度优先搜索函数void dfs(int i, int j) {ret++; // 访问次数加一vis[i][j] = true; // 标记当前位置为已访问// 遍历四个方向for (int k = 0; k < 4; k++) {int x = i + dx[k], y = j + dy[k]; // 计算新坐标// 检查新坐标是否在矩阵范围内、是否未被访问过以及是否满足某种条件(通过check函数)if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && check(x, y))dfs(x, y); // 如果满足条件,则递归调用dfs函数继续搜索}}// 坐标(i, j)的数字和是否小于等于kbool check(int i, int j) {int tmp = 0;// 计算坐标i的数字和while (i) {tmp += i % 10;i /= 10;}// 计算坐标j的数字和while (j) {tmp += j % 10;j /= 10;}// 返回是否满足条件(数字和是否小于等于k)return tmp <= k;}
};

 

 

相关文章:

floodfill算法

目录 什么是floodfill算法 题目一——733. 图像渲染 - 力扣&#xff08;LeetCode&#xff09; 题目二——200. 岛屿数量 - 力扣&#xff08;LeetCode&#xff09; 题目三——695. 岛屿的最大面积 - 力扣&#xff08;LeetCode&#xff09; 题目四—— 130. 被围绕的区域 …...

【JAVA】六亮增加贴

James Gosling&#xff08;詹姆斯.高斯林&#xff09; Java 语言源于 1991 年 4 月&#xff0c;Sun 公司 James Gosling博士 领导的绿色计划(Green Project) 开始启动&#xff0c;此计划最初的目标是开发一种能够在各种消费性电子产品(如机顶盒、冰箱、收音机等)上运行的程序…...

git提交时出现merge branch main of xxx

git提交时出现merge branch main of xxx 原因&#xff1a; 1、同事commit了一个修改A&#xff0c;push到remote 2、我把这个修改直接pull了下来&#xff08;pull是fetchmerge的操作&#xff0c;自动合并到本地workspace&#xff09; 3、同事因为后续的commit有冲突&#xff0c…...

lstm 输入数据的形状是怎么样的,他有两种输入方式,通过参数 batch_first来设置 默认是False

lstm 输入数据的形状是怎么样的&#xff0c;他有两种输入方式&#xff0c;通过参数 batch_first来设置 默认是False 当batch_firstFalse时&#xff0c;LSTM输入的数据形状通常是一个三维张量&#xff0c;其维度顺序为[sequence_length, batch_size, input_size]。下面是对这些维…...

Apache Doris 数据类型

Apache Doris 已支持的数据类型列表如下&#xff1a; 数值类型​ 类型名存储空间&#xff08;字节&#xff09;描述BOOLEAN1布尔值&#xff0c;0 代表 false&#xff0c;1 代表 true。TINYINT1有符号整数&#xff0c;范围 [-128, 127]。SMALLINT2有符号整数&#xff0c;范围 …...

编译问题 fatal error: rpc/rpc.h: No such file or directory

在编译一些第三方软件的时候&#xff0c;会经常遇到一些文件识别不到的问题&#xff0c;这里整理下做个归总。 目前可能的原因有&#xff08;排序分先后&#xff09;&#xff1a; 文件不存在&#xff1b;文件存在但路径识别不了&#xff1b;…… 这次以常见的编译lmbench测试…...

linux 安装composer

下载composer curl -sS https://getcomposer.org/installer | php下载后设置环境变量&#xff0c;直接通过命令composer -v mv composer.phar /usr/local/bin/composer查看版本看是否安装成功 composer -v...

数据库公共字段自动填充的三种实现方案

背景介绍 在实际项目开发中,我们经常需要处理一些公共字段的自动填充,比如: createTime (创建时间)updateTime (更新时间)createUser (创建人)updateUser (更新人) 这些字段在每个表中都存在,如果每次都手动设置会很麻烦。下面介绍三种常用的解决方案。 方案一&#xff1a;M…...

《MySQL 入门:数据库世界的第一扇门》

一、MySQL 简介 MySQL 是一种开源的关系型数据库管理系统&#xff0c;在数据库领域占据着重要地位。它以其高效查询、高安全性、低成本和扩展性著称&#xff0c;广泛应用于网站、企业级应用、数据分析等领域。 MySQL 具有诸多优点。首先&#xff0c;它成本低&#xff0c;作为…...

Qt之第三方库QCustomPlot使用(二)

Qt开发 系列文章 - qcustomplot&#xff08;二&#xff09; 目录 前言 一、Qt开源库 二、QCustomPlot 1.qcustomplot介绍 2.qcustomplot下载 3.qcustomplot移植 4.修改项目文件.pro 5.提升QWidget类‌ 三、技巧讲解 1.拖动缩放功能 2.等待更新 总结 前言 Qt第三方…...

JAVA-类与继承

啥是继承&#xff1f; 在JAVA中&#xff0c; 继承就是子类继承父类的特征和行为&#xff0c;使得子类拥有父类的特征和行为&#xff0c;同时还可以拥有父类所没有的特征和行为。 举个例子通俗来讲&#xff0c;兔子和羊是食草动物类&#xff0c;狮子和豹子是食肉动物类&#x…...

SSH连接报错,Corrupted MAC on input 解决方法

问题描述 客户在windows CMD中SSH连接失败&#xff0c;报错: Corrupted MAC on input ssh_dispatch_run_fatal: Connection to x.x.x.x port 22: message authentication code incorrect值得注意的是&#xff0c;客户通过别的机器做SSH连接可以成功&#xff0c;使用putty, mo…...

【C++】8___继承

目录 一、基本语法 二、继承方式 三、对象模型 四、继承中的构造与析构的顺序 五、继承中同名成员处理 六、多继承语法 七、菱形继承 一、基本语法 好处&#xff1a;减少重复的代码 语法&#xff1a; class 子类 &#xff1a; 继承方式 父类 子类 也称为 派生类 父类…...

C# 中的异常处理:构建健壮和可靠的程序

C#中的异常处理&#xff08;Exception Handling&#xff09;。异常处理是编程中非常重要的一部分&#xff0c;它允许开发者优雅地处理程序运行时可能出现的错误或意外情况。通过有效的异常处理&#xff0c;可以使应用程序更加健壮、可靠&#xff0c;并提供更好的用户体验。以下…...

基于智能合约的医院凭证共享中心路径探析

一、引言 随着医疗行业的不断发展和信息技术的进步&#xff0c;基于智能合约的医疗凭证共享中心解决方案成为了可能。在当今数字化时代&#xff0c;医疗领域面临着诸多挑战&#xff0c;如医疗数据的分散存储、信息共享的不便捷以及凭证管理的复杂性等问题。而智能合约的出现&am…...

vba学习系列(9)--按需求计数单元格数量

系列文章目录 文章目录 系列文章目录前言一、按需求计数单元格数量1.需求 二、使用步骤1.vba源码2.整理后 总结 前言 一、按需求计数单元格数量 1.需求 一个表中有多个类型的单元格内容&#xff0c;比如&#xff1a;文字、数字、特殊字符、字母数字…… 我们要计数字母数字的…...

scale index的计算

scale index定义 基本实现 需要注意&#xff0c;scale index的提出者分别构建了MATLAB和R语言的实现方式。 但是&#xff0c;需要注意&#xff0c;经过我向作者求证。 MATLAB编写的代码已经“过时了”&#xff0c;为了拥抱时代&#xff0c;作者构建了R语言包&#xff0c;名称为…...

鸿蒙实现Web组件开发

目录&#xff1a; 1、简介&使用场景2、加载网络页面3、加载本地页面4、加载HTML格式的文本数据5、设置深色模式6、上传文件7、在新窗口中打开页面8、管理位置权限 1、简介&使用场景 Web是一种基于互联网的技术和资源的网络服务系统。它是指由许多互连的计算机组成的全…...

Linux——linux系统移植

创建VSCode工程 1、将NXP官方的linux内核拷贝到Ubuntu 2、解压缩tar -vxjf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 NXP官方开发板Linux内核编译 1、将.vscode文件夹复制到NXP官网linux工程中&#xff0c;屏蔽一些不需要的文件 2、编译NXP官方EVK开发板对应的Linux系统…...

工业摄像头应对复杂环境的策略与解决方案

工业摄像头需应对复杂环境&#xff0c;如极端温度、振动、尘土、光照不足等。为确保稳定工作&#xff0c;它采用了先进技术和设计。详细分析如下&#xff1a; 一、增强环境适应性 采用高灵敏度传感器&#xff1a;使用CMOS或CCD图像传感器&#xff0c;适应低光照条件。 高精度、…...

重生之我在异世界学编程之C语言:深入动态内存管理篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一 动态内存管理的必要性二 动态…...

【经典论文阅读】Latent Diffusion Models(LDM)

Latent Diffusion Models High-Resolution Image Synthesis with Latent Diffusion Models 摘要 动机&#xff1a;在有限的计算资源下进行扩散模型训练&#xff0c;同时保持质量和灵活性 引入跨注意力层&#xff0c;以卷积方式实现对一般条件输入&#xff08;如文本或边界框…...

智能指针中的weak_ptr(弱引用智能指针)

弱引用智能指针 std::weak_ptr 可以看做是shared_ptr的助手,它不管理 shared_ptr 内部的指针。std::weak_ptr 没有重载操作符*和->&#xff0c;因为它不共享指针&#xff0c; 不能操作资源&#xff0c;所以它的构造不会增加引用计数&#xff0c;析构也不会减少引用计数,它的…...

【电子通识】机电继电器和固态继电器的区别

机电继电器 机电继电器于19世纪中叶发明。这些器件将线圈与可移动的金属触点结合使用来充当电动开关。这些器件会因为金属触点出现磨损而发生故障,例如焊死在一起。因此,在完全失效之前器件能够进行的开关周期数有限,从而限制了其总体可靠性。 一般情况下继电器控制…...

工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet

论文&#xff1a;https://arxiv.org/pdf/2311.14897v3.pdf 项目&#xff1a;https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位&#xff0c;这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…...

如何创建对话窗口

文章目录 1. 概念介绍2. 使用方法3. 示例代码我们在上一章回中介绍了Dismissible Widget相关的内容,本章回中将介绍AlertDialog Widget.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们介绍的AlertDialog是指程序中弹出的确认窗口,其实我们在上一章回中删除ListView中…...

新手上路,学Go还是Python

对于新手来说&#xff0c;Go和Python都是很好的编程语言&#xff0c;它们各有特点&#xff0c;以下是详细的对比来帮助你决定先学哪一个&#xff1a; 一、语法和学习难度 Python 语法简洁易懂&#xff1a;Python以其简洁、优雅的语法而闻名&#xff0c;代码的可读性很高。例如…...

<!DOCTYPE html>的作用是什么

一、背景 从今天开始会不定时的发布一些前端的常见面试题&#xff0c;供大家参考。今天要发布的内容是关于html的面试题的作用是什么。接下来就一起讨论以下吧 二、概念 DOCTYPE 是html5中一种标准通用标记语言的文档类型的声明&#xff0c;它的目的就是为了告诉浏览器应该以…...

EasyExcel改名为FastExce做了那些改变呢

回到&#xff1a;github原作者地址&#xff1a;https://github.com/CodePhiliaX/fastexcel 中文 |English | 什么是 FastExcel FastExcel 是由原 EasyExcel 作者创建的新项目。2023 年我已从阿里离职&#xff0c;近期阿里宣布停止更新 EasyExcel&#xff0c;作者他本人决定继…...

狗狗的生育周期:关注与呵护

狗狗的繁殖是一个复杂且需要谨慎对待的过程&#xff0c;了解其生产周期对于宠物主人以及从事相关行业的人员至关重要。 一般而言&#xff0c;狗狗的怀孕周期约为两个月左右&#xff0c;但这并非绝对固定。从受孕到分娩&#xff0c;通常在 58 至 65 天之间波动。小型犬可能相对…...

wordpress默认密码/小红书代运营

毕业论文 基于微信小程序在线电子书阅读系统 开题报告 学 院&#xff1a; 专 业&#xff1a; 年 级&#xff1a; 学生姓名&#xff1a; 指导教师&#xff1a; …...

网站建设 开发/百度竞价登录

今天&#xff0c;有个哥们在网上买了块二手机械硬盘。回家装好系统发现启动贼慢&#xff0c;开机十几分钟。遂到交流群发问。经过一番诊断最终确定为硬盘坏道导致。哥们失望至极&#xff0c;准备打开京东购买一块全新固态。本来&#xff0c;作为一个沉默宝宝天天在群里采集话题…...

辽宁省城乡建设网站/深圳网络营销策划公司

XML三种解析方式&#xff1a; SAX解析&#xff1a;基于事件驱动&#xff0c;事件机制基于回调函数的&#xff0c;得到节点和节点之间内容时也会回调事件 PULL解析&#xff1a;相同基于事件驱动&#xff0c;仅仅只是回调时是常量 DOM解析&#xff1a;是先把XML文件装入内存中。在…...

网站建设与管理管理课程/网络营销策划活动方案

L1和L2正则都是比较常见和常用的正则化项&#xff0c;都可以达到防止过拟合的效果。L1正则化的解具有稀疏性&#xff0c;可用于特征选择。L2正则化的解都比较小&#xff0c;抗扰动能力强。 L2正则化 对模型参数的L2正则项为 即权重向量中各个元素的平方和&#xff0c;通常取1/2…...

青岛餐饮加盟网站建设/抖音seo搜索引擎优化

Java实现调用腾讯地图接口获取行政地区信息 本文主要是实现通过从前端传回的经纬度&#xff0c;调用腾讯地图的接口&#xff0c;解析获取经纬度所在的行政地区信息&#xff08;获取国家&#xff0c;省份&#xff0c;城市以及对应的代码&#xff09;。 开始之前做好如下准备&a…...

财政局网站建设自查报告/国内新闻最近新闻今天

内部模块图与状态机图一、内部模块图二、状态机图一、内部模块图 二、状态机图 xmind和jpg格式文件下载链接 状态机图网址浏览链接&#xff0c;密码&#xff1a;56JC 内部模块图网址浏览链接&#xff0c;密码:ob35...