floodfill算法(洪水灌溉算法)

一)floodfill算法简介:

二)图像渲染

733. 图像渲染 - 力扣(LeetCode)

class Solution {int[] dx = {1, 0, 0, -1};int[] dy = {0, 1, -1, 0};//上下搜索的时候要使用向量数组int row=0;int col=0;int target=0;public void dfs(int[][] image,int i,int j,int color){if(image[i][j]==target){image[i][j]=color;}for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0&&x<row&&y>=0&&y<col&&image[x][y]==target){//四个方向进行深度优先遍历dfs(image,x,y,color);}}}
public int[][] floodFill(int[][] image, int i, int j, int color) {if(color==image[i][j]) return image;//防止走到重复元素的情况this.target=image[i][j];this.row=image.length;this.col=image[0].length;dfs(image,i,j,color);return image;}
}

三)岛屿数量

200. 岛屿数量 - 力扣(LeetCode)

class Solution {public boolean[][] check;int[] dx = {1, 0, 0, -1};int[] dy = {0, 1, -1, 0};int row=0;int col=0;public void dfs(char[][] array,int i,int j){check[i][j]=true;for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];
if(x>=0&&x<row&&y>=0&&y<col&&array[x][y]=='1'&&check[x][y]==false){check[x][y]=true;dfs(array,x,y);}}}public int numIslands(char[][] array) {this.row=array.length;this.col=array[0].length;this.check=new boolean[row][col];int ret=0;for(int i=0;i<row;i++){for(int j=0;j<col;j++){if(array[i][j]=='1'&&check[i][j]==false){check[i][j]=true;ret++;dfs(array,i,j);}}}return ret;}
}

四)岛屿的最大面积:

​​​​​​695. 岛屿的最大面积 - 力扣(LeetCode)

算法原理:

1)想要解决本题核心的思路还是做一次深度优先遍历,我们一开始来遍历这个岛屿,当扫描到一个陆地之后(这个数组的值等于1),就从这个陆地也就是1开始来做一次深度优先遍历,上下左右都来进行扫描

2)此时定义一个全局的变量count,在深度优先遍历,只要进入一次dfs,就让这个count++,因为在每一次进入到dfs函数的时候,都是相当于是进入到了一块陆地,档次是针对这个起始陆地深度优先遍历完成之后,此时的这个count值就是统计这块岛屿的面积,然后再使用ret统计最终的结果;

3)下面的写法是dfs带有返回值和dfs不带有返回值的写法:

class Solution {public boolean[][] check;int[] dx = {1, 0, 0, -1};int[] dy = {0, 1, -1, 0};int row=0;int col=0;int ret=0;int count=0;public void dfs(int[][] array,int i,int j){count++;for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];
if(x>=0&&x<row&&y>=0&&y<col&&array[x][y]==1&&check[x][y]==false){check[x][y]=true;dfs(array,x,y);}}}public int maxAreaOfIsland(int[][] array) {this.row=array.length;this.col=array[0].length;this.check=new boolean[row][col];for(int i=0;i<row;i++){for(int j=0;j<col;j++){if(array[i][j]==1&&check[i][j]==false){check[i][j]=true;count=0;dfs(array,i,j);ret=Math.max(count,ret);}}}return ret;}
}
class Solution {public boolean[][] check;int[] dx = {1, 0, 0, -1};int[] dy = {0, 1, -1, 0};int row=0;int col=0;int ret=0;public int dfs(int[][] array,int i,int j){int count=1;for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0&&x<row&&y>=0&&y<col&&array[x][y]==1&&check[x][y]==false){check[x][y]=true;count+=dfs(array,x,y);}}return count;}public int maxAreaOfIsland(int[][] array) {this.row=array.length;this.col=array[0].length;this.check=new boolean[row][col];for(int i=0;i<row;i++){for(int j=0;j<col;j++){if(array[i][j]==1&&check[i][j]==false){check[i][j]=true;ret=Math.max(dfs(array,i,j),ret);}}}return ret;}
}

五)被围绕的区域

130. 被围绕的区域 - 力扣(LeetCode)

算法原理:

1)首先遍历整个二维矩阵的边界,先找到边界区域的圆圈,先进行标记一下,那么剩下的圆圈自然就是在内部的圆圈,标记的时候可以搞一个check数组,也可以把边界的情况处理成一个额外字符

2)然后直接修改内部的圆圈;

class Solution {public boolean[][] check;public int row=0;public int col=0;int[] dx = {1, 0, 0, -1};int[] dy = {0, 1, -1, 0};public void dfs(char[][] board,int i,int j,char ch){check[i][j]=true;board[i][j]=ch;for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];
if(x>=0&&x<row&&y>=0&&y<col&&board[x][y]=='O'&&check[x][y]==false){dfs(board,x,y,ch);}}}public void solve(char[][] board) {
//1.先进行初始化操作this.row=board.length;this.col=board[0].length;this.check=new boolean[row][col];
//2.进行处理边界情况下的O字符for(int i=0;i<col;i++){if(board[0][i]=='O'&&check[0][i]==false){dfs(board,0,i,'O');}
if(board[row-1][i]=='O'&&check[row-1][i]==false){dfs(board,row-1,i,'O');}}for(int j=0;j<row;j++){if(board[j][0]=='O'&&check[j][0]==false){dfs(board,j,0,'O');}
if(board[j][col-1]=='O'&&check[j][col-1]==false){dfs(board,j,col-1,'O');}}System.out.println(Arrays.deepToString(check));  
//3.开始处理非边界上的Ofor(int i=0;i<row;i++){for(int j=0;j<col;j++){if(board[i][j]=='O'&&check[i][j]==false){dfs(board,i,j,'X');}}}}
}

六)太平洋大西洋水流问题

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

解法1:直接来解决这个问题,直接进行遍历二维数组中的每一个点,直接判断某一个点是否能够到达太平洋也可以到达大西洋,但是可能会出现重复路径的情况,所以说时间有可能会超时

解法2:正难则反:反着看,假设太平洋或者是大西洋的水能够逆着来,能够走到哪些位置,直接看大于等于当前位置的位置此时我们枚举完成第一行和最后一行的所有元素,并且针对与这些所有元素全部做一次深度优先遍历,将所有能够流向大西洋的点进行标记

class Solution {List<List<Integer>> ret=new ArrayList<>();int row=0;int col=0;int[] dx = {1, 0, 0, -1};int[] dy = {0, 1, -1, 0};public void dfs(int[][] array,int i,int j,boolean[][] check){check[i][j]=true;for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];
if(x>=0&&x<row&&y>=0&&y<col&&check[x][y]==false&&array[i][j]<=array[x][y]){dfs(array,x,y,check);}}}public List<List<Integer>> pacificAtlantic(int[][] array) {this.row=array.length;this.col=array[0].length;boolean[][] pac=new boolean[row][col];boolean[][] atc=new boolean[row][col];
//1.先处理太平洋for(int i=0;i<col;i++){dfs(array,0,i,pac);//处理上边界,上边界是找所有可能从大西洋从(i,j)方向逆流到哪一个位置}for(int j=0;j<row;j++){dfs(array,j,0,pac);//处理左边界}
//2.再来处理大西洋for(int i=0;i<col;i++){dfs(array,row-1,i,atc);//处理下边界}for(int j=0;j<row;j++){dfs(array,j,col-1,atc);//处理右边界,右边界是找所有可能从大西洋从(i,j)方向逆流到哪一个位置}
//3.最后进行提取结果for(int i=0;i<row;i++){for(int j=0;j<col;j++){if(pac[i][j]==true&&atc[i][j]==true){List<Integer> temp=new ArrayList<>();temp.add(i);temp.add(j);ret.add(temp);}}}
//4.返回最终结果       return ret;}
}

七)扫雷游戏

529. 扫雷游戏 - 力扣(LeetCode)

一)题目解析:

1)刚一开始,这道题给了我们原始的一个字符矩阵,这个矩阵代表的是扫雷的棋盘,然后会继续给我们一个中心点告诉我们要开始进行点击的位置,点击之后通过下面一系列的规则把点击之后的结果给展示出来,然后返回最终结果即可

2)如果此时如果某一个地雷没有被挖出的时候,此时的这个位置就被标记成了一个M,E这个字符表示没有被挖出的空格,E表示此时还没有被搜索到的区域,在没有正式的点击棋盘之前,除了地雷的位置被标记成一个M之外,其余的地方都被标记成了E,当进行点击之后,B表示的是已经被挖出的方块,代表没有相邻上,下,左,右,和所有4个对角线地雷的已挖出的空白方块,数字1-8代表周围地雷的个数,X代表已经被挖出的地雷,如果玩家直接点击地雷的位置,直接把对应的位置标记成X,返回即可

3)此时就拿我们题目中给定的实例来说,当进行点击(3,0)这个位置的时候,就会上下左右的递归地将所有的空方格全部展开,一旦出现了别的空方格,又会递归地展开;

4)但是此时如果出现展开一个空方格,它的周围有地雷,那么就直接修改它的数字即可,修改成他最近的地雷数

二)算法原理:

1)当进行点击某一个位置之后,首先判断这个点击的位置,当点击的这个位置周围没有地雷,那么它就是空方格,如果发现这个空方格子周围没有地雷,那么我们就需要递归性的把它周围的空方格全部打开,并且将格子内的字符修改成B

2)如果发现这个空格子上下左右有地雷,那么就直接将我当前的这个位置修改成周围地雷的个数,然后会返回;

3)但是这个题和之前的题有一些不同,之前我们是进行扩展四个位置,但是此时我们是需要进行扩展8个位置

class Solution {int[] dx = {0, 1, 0, -1, 1, 1, -1, -1};int[] dy = {1, 0, -1, 0, 1, -1, 1, -1};int row=0;int col=0;public void dfs(char[][] board,int i,int j){//1.先考虑这个空格子周围是否存在地雷int count=0;for(int k=0;k<8;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0&&x<row&&y>=0&&y<col){if(board[x][y]=='M'){count++;}}
}//2.根据雷的数目来更新这个值是否填充数字还是填充一个字符Bif(count==0){board[i][j]='B';for(int k=0;k<8;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0&&x<row&&y>=0&&y<col&&board[x][y]=='E'){dfs(board,x,y);}}}else{board[i][j]=(char)(count+'0');}
}public char[][] updateBoard(char[][] board, int[] click) {
//1.先进行初始化全局变量的初始化this.row=board.length;this.col=board[0].length;int taregtX=click[0];int taregtY=click[1];
//2.先处理点击地雷的情况if(board[taregtX][taregtY]=='M'){//当前这个位置没有被扫描过board[taregtX][taregtY]='X';return board;}
//3.再来处理空格的情况dfs(board,taregtX,taregtY);return board;}
}

八)机器人的运动范围

剑指 Offer 13. 机器人的运动范围 - 力扣(LeetCode)

class Solution {int row=0;int col=0;int max=0;int count=0;boolean[][] check;int[] dx = {1, 0, 0, -1};int[] dy = {0, 1, -1, 0};public boolean check(int x,int y){//将两个数的所有位数之和加起来int sum=0;while(x>0){sum+=x%10;x/=10;}while(y>0){sum+=y%10;y/=10;}return sum<=max;}public void dfs(int i,int j){count++;for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];
if(x>=0&&x<row&&y>=0&&y<col&&check(x,y)==true&&check[x][y]==false){check[x][y]=true;dfs(x,y);}}}public int movingCount(int m, int n, int k) {this.row=m;this.col=n;this.max=k;this.check=new boolean[row][col];if(k>=0) check[0][0]=true;dfs(0,0);return count;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/107100.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STC15/8单片机特有的PWM寄存器和普通定时器实现PWM输出

STC15/8单片机特有的PWM寄存器和普通定时器实现PWM输出 🌿主要针对STC15W4型号特有的6通道15位专门的高精度PWM。 🌿STC8系列 ✨STC15W4K32S4系列单片机具有6通道15位专门的高精度PWM(带死区控制)和2通道CCP(利用它的高速脉冲输出功能可实现11~16位PWM);(STC15F/L2K60S2系…

Mysql同步数据到Doris的踩坑过程

问题背景 由于项目需要&#xff0c;需要把多个Mysql数据库的数据同步到Doris数据库&#xff0c;然后利用Doris强调的计算和查询能力&#xff0c;来满足业务需求。有关Doris可以查看它的官方文档来了解它。 seatunnel的使用到放弃 缘起 从《第十届GIAC全球互联网架构大会》了…

口袋参谋:淘宝不限类目,透视竞品实时销量!快试试这个插件

​在运营一家店铺之前&#xff0c;可以先了解各类目宝贝的市场行情&#xff0c;及时掌握不同类目宝贝的价格、销售情况&#xff0c;根据需求制定出属于自己的营销策略。 【可跨类目竞店透视】功能&#xff1a; 支持一键获取任意店铺宝贝概况信息 【跨类目竞店透视】功能使用 …

C/C++之链表的建立

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.头插 1.1简介 1.2代码实现头插 …

PyCharm克隆github上开源的项目

PyCharm怎么clone github上开源的项目 一、先要确保PyCharm正确的配置了Git 如果你已经在PyCharm中配置好了Git&#xff0c;可以跳过此步骤&#xff0c;直接看下一步。 那么怎么在PyCharm中配置Git呢&#xff1f; 百度搜索Git安装包&#xff0c;安装过程不再多说&#xff0…

数据结构与算法基础-学习-34-基数排序(桶排序)

目录 一、基本思想 二、算法思路 1、个位排序 &#xff08;1&#xff09;分配 &#xff08;2&#xff09;收集 2、十分位排序 &#xff08;1&#xff09;分配 &#xff08;2&#xff09;收集 三、源码分享 1、InitMyBucket 2、DestroyMyBucket 3、ClearMyBucket 4、…

JMeter接口测试

0.前言, 我决定我的代码必须要提升性能了,而不是写不写得出来的问题了, however,怎么知道我的代码是不是很烂和健壮性,需要专业的测试工具来测试出来,如高并发QPS是什么?,高频率是什么? 怎样自动化测试解放双手 1.jmeter是apache使用java的测试工具,模拟巨大的负载,官网地址…

C++ 特性模版

目录 1. 非类型模板参数 2. 模板的特化 2.1 概念 2.2 函数模板特化 2.3 类模板特化 2.3.1 全特化 2.3.2 偏特化 2.3.3 类模板特化应用示例 3 模板分离编译 3.1 什么是分离编译 3.2 模板的分离编译 3.3 解决方法 4. 模板总结 1. 非类型模板参数 模板参数分类类型形…

数据库数据恢复-Oracle数据库truncate的数据恢复案例

Oracle数据库故障&分析&#xff1a; 北京某单位Oracle 11g R2数据库误执行truncate table CM_CHECK_ITEM_HIS&#xff0c;表数据丢失&#xff0c;查询该表时报错。数据库备份无法使用&#xff0c;表数据无法查询。 Oracle数据库Truncate数据的机理&#xff1a;执行Trunca…

如何初始化静态成员在类中

c - How do I initialize a const data member? - Stack Overflow

【GO语言基础】基本数据类型

系列文章目录 【Go语言学习】ide安装与配置 【GO语言基础】前言 【GO语言基础】变量常量 【GO语言基础】数据类型 文章目录 系列文章目录数据类型数值型&#xff1a;整数类型&#xff1a;浮点数类型&#xff1a; 字符型-布尔型-字符串零值转义字符 常用类型转换运算符总结 数据…

2023-9-11 台阶-Nim游戏

题目链接&#xff1a;台阶-Nim游戏 #include <iostream> #include <algorithm>using namespace std;int main() {int n;cin >> n;int res 0;for(int i 1;i < n; i){int x;cin >> x;if(i % 2) res ^ x; }if(res) cout << "Yes" &l…