FloodFill算法——DFS

FloodFill算法就是用来寻找性质相同的连通快的算法,这篇博客都是用dfs来实现FloodFill算法

1.图像渲染

题目链接:733. 图像渲染 - 力扣(LeetCode) 

 题目解析:将和(sr,sc)相连的所有像素相同的点,将这些点的值都修改为目标值

算法讲解:

利用深搜,遍历所有与初始点相连的所有像素相同的点,然后将其修改成指定的像素值即可

代码实现:

一个小细节:如果color==image[sr][sc],此时就不用去遍历image了,此时直接返回image即可,或者也可以创建一个check的boolean类型的数组,去标记已经访问的位置

//第一种写法
class Solution {int h,l,prev;int[] dx={0,0,1,-1};int[] dy={1,-1,0,0};public int[][] floodFill(int[][] image, int sr, int sc, int color) {h=image.length;l=image[0].length;prev=image[sr][sc];if(prev==color) return image;dfs(image,sr,sc,color);return image;}public void dfs(int[][] image,int i,int j,int color){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<h && y>=0 && y<l && image[x][y]==prev){dfs(image,x,y,color);}}}
}//第二种写法
class Solution {int h,l,prev;int[] dx={0,0,1,-1};int[] dy={1,-1,0,0};boolean[][] check;public int[][] floodFill(int[][] image, int sr, int sc, int color) {h=image.length;l=image[0].length;check=new boolean[h][l];prev=image[sr][sc];dfs(image,sr,sc,color);return image;}public void dfs(int[][] image,int i,int j,int color){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<h && y>=0 && y<l && image[x][y]==prev && check[x][y]==false){check[x][y]=true;dfs(image,x,y,color);check[x][y]=false;}}}
}

2.岛屿数量 

题目链接:200. 岛屿数量 - 力扣(LeetCode)

 题目解析:计算岛屿的数量,也就是计算grid数组中数字为1的连通快的个数 

算法讲解: FloodFill

首先要创建一个同等规模的check的boolean数组,先遍历一遍grid数组,当遇到1时且该对应的check[i][j]==false,就通过dfs递归函数将这个位置的上下左右中为1的位置的对应到check数组中的值改为true即可

代码实现:

class Solution {boolean[][] check;int h,l;int[] dx={0,0,-1,1};int[] dy={-1,1,0,0};public int numIslands(char[][] grid) {h=grid.length;l=grid[0].length;int ret=0;check=new boolean[h][l];for(int i=0;i<h;i++){for(int j=0;j<l;j++){if(grid[i][j]=='1'&&check[i][j]==false){ret++;dfs(grid,i,j);}}}return ret;}public void dfs(char[][] grid,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<h && y>=0 && y<l && check[x][y]==false && grid[x][y]=='1'){dfs(grid,x,y);}}}
}

 3.岛屿的最大面积

题目解析:返回最大岛屿的面积

算法讲解:FloodFill

依旧是对grid数组做一遍深度优先遍历,当遇到1时,就上下左右去寻找连通的1,且创建一个全局变量area去记录每一次递归时找到的岛屿的面积

代码实现:

代码细节:每次递归之前要将area置为0,因为每一次递归都是去找新的岛屿,计算新的岛屿的面积之前,要将之前计算的岛屿的面积去掉,也就是将area置为0 

class Solution {boolean[][] vis;int h,l,area,ret;int[] dx={0,0,1,-1};int[] dy={1,-1,0,0};public int maxAreaOfIsland(int[][] grid) {h=grid.length;l=grid[0].length;vis=new boolean[h][l];for(int i=0;i<h;i++){for(int j=0;j<l;j++){if(grid[i][j]==1&&vis[i][j]==false){area=0;//小细节dfs(grid,i,j);ret=Math.max(ret,area);}}}return ret;}public void dfs(int[][] grid,int i,int j){area++;vis[i][j]=true;for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0 && x<h && y>=0 && y<l && grid[x][y]==1 && vis[x][y]==false){dfs(grid,x,y);}}}
}

4.被围绕的区域

题目链接:130. 被围绕的区域 - 力扣(LeetCode) 

 题目解析:将矩阵中的被X围绕的连通O区域中的字母全部改为字母X

算法讲解:FloodFill

这道题的难点就是在于处理位于边界的连通O区域,如果我们直接对矩阵进行一遍深度遍历,那马就要写两个dfs函数,一个用来处理内部的O区域,另一个用来处理处于边界的O区域,但是这样写是在是太复杂了

正难则反,,我们可以先去处理边界的情况,先将位于边界的连通O区域全部改为字符点,处理完边界情况之后,在去遍历矩阵,遇到字符点,则就将其还原成O,此时如果遇到O,那么此时的O区域肯定是合法的,此时直接将O改为X即可

代码实现:

class Solution {int h,l;int[] dx={0,0,1,-1};int[] dy={1,-1,0,0};public void solve(char[][] board) {h=board.length;l=board[0].length;for(int j=0;j<l;j++){if(board[0][j]=='O') dfs(board,0,j);if(board[h-1][j]=='O') dfs(board,h-1,j);}for(int i=0;i<h;i++){if(board[i][0]=='O') dfs(board,i,0);if(board[i][l-1]=='O') dfs(board,i,l-1);}for(int i=0;i<h;i++){for(int j=0;j<l;j++){if(board[i][j]=='.') board[i][j]='O';else if(board[i][j]=='O') board[i][j]='X';}}}public void dfs(char[][] board,int i,int j){board[i][j]='.';for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0 && x<h && y>=0 && y<l && board[x][y]=='O'){dfs(board,x,y);}}}
}

5.太平洋大西洋流水问题 

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

题目解析:找出矩阵中既能流入太平洋和大西洋的位置

解法一:直接暴搜

直接遍历矩阵,直接对每一个位置进行一遍FloodFill,但是这样会出现重复走大量的重复路径,代码可能会超时 

解法二:正难则反 

我们可以转换一下思路,题目要求我们找出既能流入太平洋又能流入大西洋的位置,可以反过来思考,从太平洋或者大西洋能流入矩阵的哪一些位置,此时创建两个同等规模的boolean类型的数组paci和atla,如果paci[i][j]或者atla[i][j]的值为true,那么就代表从太平洋或者大西洋的水能流入(i,j)位置,当paci[i][j]和atla[i][j]的值同时为true时,就代表太平洋和大西洋的水都能能流入(i,j)位置 

此时对分别对第一行和第一列,最后一行和最后一列,分别进行一遍FloodFill即可 

代码实现:

class Solution { List<List<Integer>> ret;int h,l;int[] dx={0,0,1,-1};int[] dy={1,-1,0,0};public List<List<Integer>> pacificAtlantic(int[][] heights) {h=heights.length;l=heights[0].length;boolean[][] paci=new boolean[h][l];boolean[][] atla=new boolean[h][l];ret=new ArrayList<>();//处理太平洋//第一行for(int j=0;j<l;j++) dfs(heights,0,j,paci);//第一列for(int i=0;i<h;i++) dfs(heights,i,0,paci);//处理大西洋//最后一行for(int j=0;j<l;j++) dfs(heights,h-1,j,atla);//最后一列for(int i=0;i<h;i++) dfs(heights,i,l-1,atla);for(int i=0;i<h;i++){for(int j=0;j<l;j++){if(paci[i][j]==true&&atla[i][j]==true){List<Integer> tmp=new ArrayList<>();tmp.add(i);tmp.add(j);ret.add(tmp);}}}return ret;}public void dfs(int[][] heights,int i,int j,boolean[][] ocean){ocean[i][j]=true;for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0 && x<h && y>=0 && y<l && heights[x][y]>=heights[i][j] && ocean[x][y]==false){dfs(heights,x,y,ocean);}}}
}

6.扫雷游戏 

题目链接:529. 扫雷游戏 - 力扣(LeetCode) 

题目解析:就是扫雷游戏的规则,点击一个为挖出的方块,则与这个空格相连的空格也会被展开,如果某一个空格的相邻有地雷的花,就不展开与这个空格相邻的空格,只需要将这个空格的值改为地雷的数量即可

算法讲解:FloodFill 

这道题就是对棋盘从点击的位置进行一遍深度遍历即可,如果遇到为挖出的空格,则将其翻转即可,但是如果未挖出的空格相邻位置有地雷,将这个空格的值改为地雷的数量

则此时dfs函数就是用来翻转空格的,但是翻转的情况有两种,如果空格的相邻位置没有地雷,将M改为B即可,如果空格的相邻位置有地雷,要将M给为地雷的数量,所以此时在递归之前,要对地雷的数量进行一个判断

代码实现:

class Solution {int h,l;int[] dx={0,0,-1,1,-1,-1,1,1};int[] dy={-1,1,0,0,-1,1,-1,1};public char[][] updateBoard(char[][] board, int[] click) {h=board.length;l=board[0].length;int x=click[0];int y=click[1];if(board[x][y]=='M'){board[x][y]='X';return board;}dfs(board,x,y);return board;}public void dfs(char[][] board,int i,int j){//判断地雷的数量int count=0;for(int k=0;k<8;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0 && x<h && y>=0 && y<l && board[x][y]=='M'){count++;}}if(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<h && y>=0 && y<l && board[x][y]=='E'){dfs(board,x,y);}}}else{board[i][j]=(char)('0'+count);}}
}

7. 衣橱整理

题目链接:LCR 130. 衣橱整理 - 力扣(LeetCode) 

题目描述:如上图

算法讲解:FloodFill

依旧是对m行n列的放个做一遍深度优先遍历即可

代码实现:

class Solution {int ret;int h,l;boolean[][] vis;int[] dx={0,0,-1,1};int[] dy={-1,1,0,0};public int wardrobeFinishing(int m, int n, int t) {h=m;l=n;vis=new boolean[h][l];dfs(0,0,t);return ret;}public void dfs(int i,int j,int t){vis[i][j]=true;ret++;for(int k=0;k<4;k++){int x=i+dx[k];int y=j+dy[k];int tmp=(x/10)+(x%10)+(y/10)+(y%10);if(x>=0 && x<h && y>=0 && y<l && tmp<=t && vis[x][y]==false){dfs(x,y,t);}}}
}

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

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

相关文章

【BUUCTF系列】[极客大挑战 2019]LoveSQL 1

本文仅用于技术研究&#xff0c;禁止用于非法用途。 Author:枷锁 文章目录一、题目核心漏洞分析二、关键解题步骤与技术解析1. 确定列数&#xff08;ORDER BY&#xff09;2. 联合查询获取表名3. 爆破字段名4. 提取Flag三、漏洞根源与防御方案1. 漏洞成因2. 防御措施四、CTF技巧…

AI时代,童装销售的“指路明灯”

别看现在AI、大数据这些词眼花缭乱的&#xff0c;当年我刚入行那会儿&#xff0c;也跟你一样&#xff0c;对着一堆库存和销量数据发愁&#xff0c;不知道劲儿该往哪使。童装销售这行&#xff0c;看着简单&#xff0c;其实水挺深。不过呢&#xff0c;这二十多年摸爬滚打下来&…

Swin-Transformer从浅入深详解

第一部分&#xff1a;出现背景在 Swin Transformer 出现之前&#xff0c;计算机视觉&#xff08;Computer Vision, CV&#xff09;领域主要由 CNN (卷积神经网络) 主导。后来&#xff0c;NLP&#xff08;自然语言处理&#xff09;领域的 Transformer 模型被引入 CV&#xff0c;…

如何手动打包 Linux(麒麟系统)的 Qt 程序

gcc版本 gcc版本确保目标系统&#xff08;运行环境&#xff09;的 GCC 版本 高于或等于开发环境的版本&#xff0c;否则程序无法在目标平台运行。通过 gcc -v 可查看当前版本。cmake生成可执行文件 强烈建议在cmakelists添加设置运行时 rpath 为 $ORIGIN/…/lib&#xff08;相对…

解决 “crypto.hash is not a function”:Vite 从 6.x 升级至 7.x 后 `pnpm run dev` 报错问题

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …

我的创作纪念日____在 CSDN一年来的成长历程和收获

365 天创作札记&#xff1a;在代码与文字的褶皱里&#xff0c;遇见 1300 束光一年来。点开csdn网站后台粉丝数的那一刻&#xff0c;1327 这个数字在屏幕上微微发烫。原来那些在深夜敲下的字符、调试到凌晨的代码示例、反复修改的技术拆解&#xff0c;真的在时光里悄悄织成了一张…

VirtualBox 的 HOST 键(主机键)是 右Ctrl 键(即键盘右侧的 Ctrl 键)笔记250802

VirtualBox 的 HOST 键&#xff08;主机键&#xff09;是 右Ctrl 键&#xff08;即键盘右侧的 Ctrl 键&#xff09;笔记250802 VirtualBox 的 HOST 键&#xff08;主机键&#xff09;是什么?HOST键 是 右Ctrl 键VirtualBox 的 主机键&#xff08;Host Key&#xff09; 是一个…

Zama的使命

全同态加密&#xff08;Fully Homomorphic Encryption&#xff0c;FHE&#xff09;实现互联网端到端加密的使命的重要里程碑。(FHE) 是一种无需解密即可处理数据的技术。它可用于在公共、无需许可的区块链上创建私人智能合约&#xff0c;只有特定用户才能看到交易数据和合约状态…

Go语言流式输出技术实现-服务器推送事件(Server-Sent Events, SSE)

目录引言背景与技术概述实现技术细节1. HTTP 头部配置2. 事件格式与发送3. 保持连接与刷新4. 处理连接关闭4.1 使用上下文管理连接生命周期4.2 使用通道管理客户端连接5. 客户端交互6.demo7.Go转发大模型流式输出demo引言 服务器推送事件&#xff08;Server-Sent Events, SSE&…

高端房产管理小程序

系统介绍1、用户端地图找房&#xff1a;对接地图API&#xff0c;地图形式显示周边房源,支持新盘和租房两种模式查询房价走势&#xff1a;城市房价走势&#xff0c;由后台每月录入房源搜索&#xff1a;搜索房源&#xff0c;支持多维度筛选房源类型&#xff1a;新盘销售、房屋租赁…

文本转语音(TTS)脚本

文本转语音(TTS)脚本 概述 generate_voice.py 是一个用于生成语音的Python脚本。该脚本提供了文本转语音(TTS)功能&#xff0c;可以将文本内容转换为语音文件。 功能特性 文本转语音: 将输入的文本转换为语音文件多种语音选项: 支持不同的语音类型和参数批量处理: 可以处理多个…

磁盘管理与分区

磁盘管理 一、磁盘类型 SATA,SCSI,SAS类型的磁盘&#xff0c;在Linux中用sd来表示。 其中第一块硬盘为sda&#xff0c;第二块二sdb&#xff0c;以此类推。 第一块硬盘的第一个分区为sda1。 nvme类型的磁盘&#xff0c;在Linux中使用nvmeXnYpZ进行表示。 X&#xff1a;数字&…

Linux 逻辑卷管理

练习创建物理卷(pv->vg->lv)物理卷&#xff08;PV&#xff09;就像把一块块独立的硬盘&#xff0c;标记成 "可用于搭建 LVM 的积木"&#xff0c;让系统知道这些硬盘可以被 LVM 管理。#把sdb这块硬盘标记为物理卷&#xff08;相当于给这块积木盖章&#xff0c;说…

向日葵参考基因组

向日葵参考基因组升级多个版本 向日葵基因组为油脂代谢、开花调控及菊类植物进化提供新见解-文献精读151-CSDN博客 官网 https://www.sunflowergenome.org/annotations-data/

什么是爬虫协议?

什么是爬虫协议&#xff1f; 爬虫协议&#xff08;Crawl Protocol&#xff09;是指为了有效地收集网页内容而建立的一些规定和标准&#xff0c;用以指导网络爬虫如何在互联网上抓取信息。 爬虫协议主要指的是Robots协议&#xff08;Robots Exclusion Protocol&#xff09;&am…

空间平面旋转与xoy平行

空间平面旋转与xoy平行 法向量 空间平面axbyczd0的其中一个法向量(a,b,c),法向量垂直于空间平面。目标平面平行于xoy的平面为0x0yczd0;其中一个法向量为(0,0,c),c可以为不为0的任意值&#xff0c;取(0,0,1)&#xff0c;目标平面的的法向量垂直于xoy平面 向量叉乘点乘 两个向量的…

odoo reportbro 拖拽式报表设计

报表设计以及下载 在实际业务中应用非常的广泛且频繁。odoo 本身也具有报表设计功能&#xff0c;但都是代码模式。且需要开发人员定制化开发&#xff0c;耗费成本高 所以引入reportbro报表设计就非常的简单快捷。低代码模式 以下以销售报表为例进行演示 报表字段配置报表界面设…

数字信号处理_编程实例1

stem([1,2,3]) 一、初始设置 %% 初始设置 % 清空工作空间&#xff0c;关闭无关页面 clc,clear,close all; % 绘图变量 font_size 12; %全局基础字体大小 axis_size 10; %坐标轴刻度标签字体大小 line_width 2; %绘图线条宽度 legend_size 10.5; %图例字体大小 marker_siz…

Docker 安装部署 OceanBase

1.拉取镜像 docker pull oceanbase/oceanbase-ce:latest2.启动oceanbase容器 docker run -p 2881:2881 --name oceanbase-ce -e MINI_MODE0 -d quay.io/oceanbase/oceanbase-ce3.查看oceanbase初始化的日志信息 docker logs oceanbase-ce4.进入oceanbase容器 docker exec -it o…

【华为机试】685. 冗余连接 II

文章目录685. 冗余连接 II题目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a;解题思路算法分析核心思想算法策略算法对比问题分类流程图并查集环检测流程入度统计与候选边选择情况分析决策树完整算法流程复杂度分析时间复杂度空间复杂度关键实现技巧1. 并查集优化2…