BFS 解决 FloodFill 算法

news2024/11/6 7:18:13

BFS 解决 FloodFill 算法

    • 题目一: 图像渲染
      • 1. 题⽬链接:
      • 2. 题⽬描述:
      • 3. 算法思路:
      • 4.代码
    • 题目二: 岛屿数量
      • 1. 题⽬链接:
      • 2. 题⽬描述:
      • 3. 算法思路:
      • 4.代码
    • 题目三:被围绕的区域
      • 1. 题⽬链接:
      • 2. 题⽬描述:
      • 3. 算法思路:
      • 4.代码

题目一: 图像渲染

1. 题⽬链接:

https://leetcode.cn/problems/flood-fill/description/

2. 题⽬描述:

有⼀幅以 m x n 的⼆维整数数组表⽰的图画 image ,其中 image[i][j] 表⽰该图画的像素值⼤⼩。 你也被给予三个整数
sr , sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进⾏ 上⾊填充 。 为了完成 上⾊⼯作
,从初始像素开始,记录初始坐标的 上下左右四个⽅向上 像素值与初始坐标相同 的相连像素点,接着再记录这四个⽅向上符合条件的像素点与他们对应
四个⽅向上 像素值与初始坐 标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜⾊值改为 newColor 。 最后返回
经过上⾊渲染后的图像 。

在这里插入图片描述
在这里插入图片描述

3. 算法思路:

可以利⽤「深搜」或者「宽搜」,遍历到与该点相连的所有「像素相同的点」,然后将其修改成指定的像素即可,本题这里采取的解法是利用队列+深搜哦。

4.代码

class Solution 
{
 int[] dx = {0, 0, 1, -1};
 int[] dy = {1, -1, 0, 0};
 public int[][] floodFill(int[][] image, int sr, int sc, int color) 
 {
 int prev = image[sr][sc]; // 统计刚开始的颜⾊ 
 if(prev == color) return image; // 处理边界情况 
 int m = image.length, n = image[0].length;
 Queue<int[]> q = new LinkedList<>();
 q.add(new int[]{sr, sc});
 while(!q.isEmpty())
 {
 int[] t = q.poll();
 int a = t[0], b = t[1];
 image[a][b] = color;
 // 上下左右四个⽅向 
 for(int i = 0; i < 4; i++)
 {
 int x = a + dx[i], y = b + dy[i];
 if(x >= 0 && x < m && y >= 0 && y < n && image[x][y] == prev)
 {
 q.add(new int[]{x, y});
 }
 }
 }
 return image;
 }
 }

题目二: 岛屿数量

1. 题⽬链接:

https://leetcode.cn/problems/number-of-islands/description/

2. 题⽬描述:

给你⼀个由 ‘1’(陆地)和 ‘0’(⽔)组成的的⼆维⽹格,请你计算⽹格中岛屿的数量。
岛屿总是被⽔包围,并且每座岛屿只能由⽔平⽅向和/或竖直⽅向上相邻的陆地连接形成。 此外,你可以假设该⽹格的四条边均被⽔包围。

在这里插入图片描述

3. 算法思路:

遍历整个矩阵,每次找到**「⼀块陆地」**的时候:

• 说明找到**「⼀个岛屿」**,记录到最终结果 ret ⾥⾯;


并且将这个陆地相连的所有陆地,也就是这块「岛屿」,全部「变成海洋」。这样的话,我们下次遍历到这块岛屿的时候,它「已经是海洋」了,不会影响最终结果。

• 其中「变成海洋」的操作,可以利⽤「深搜」和「宽搜」解决,其实就是上一题 图像渲染 这道题~ 这样,当我们,遍历完全部的矩阵的时候,
ret 存的就是最终结果。

4.代码

在这里class Solution 
{
 int[] dx = {0, 0, -1, 1};
 int[] dy = {1, -1, 0, 0};
 boolean[][] vis = new boolean[301][301];
 int m, n;
 public int numIslands(char[][] grid) 
 {
 m = grid.length; n = grid[0].length;
 int ret = 0;
 for(int i = 0; i < m; i++)
 {
 for(int j = 0; j < n; j++)
 {
 if(grid[i][j] == '1' && !vis[i][j])
 {
 ret++;
 bfs(grid, i, j);
 }
 }
 }
 return ret;
 }
 public void bfs(char[][] grid, int i, int j)
 {
 Queue<int[]> q = new LinkedList<>();
 q.add(new int[]{i, j});
 vis[i][j] = true;
 while(!q.isEmpty())
 {
 int[] t = q.poll();
 int a = t[0], b = t[1];
 for(int k = 0; k < 4; k++)
 {
 int x = a + dx[k], y = b + dy[k];
 if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' && 
!vis[x][y])
 {
 q.add(new int[]{x, y});
 vis[x][y] = true;
 }
 }

 }
 }
}



插入代码片

题目三:被围绕的区域

1. 题⽬链接:

https://leetcode.cn/problems/surrounded-regions/description/

2. 题⽬描述:

给你⼀个 m x n 的矩阵 board ,由若⼲字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域 ⾥所有的 ‘O’
⽤ ‘X’ 填充。

在这里插入图片描述

提示:

m == board.length n == board[i].length 1 <= m, n <= 200 board[i][j] 为
‘X’ 或 ‘O’

3. 算法思路:

算法思路:
正难则反。 可以先利⽤ bfs 将与边缘相连的 ‘0’ 区域做上标记,然后重新遍历矩阵,将没有标记过的 ‘0’

修改成 ‘X’ 即可。

4.代码

class Solution 
{
 int[] dx = {0, 0, 1, -1};
 int[] dy = {1, -1, 0, 0};
 int m, n;
 public void solve(char[][] board) 
 {
 m = board.length; n = board[0].length;
 // 1. 先处理边界的 'O' 联通块,全部修改成 '.' 
 for(int j = 0; j < n; j++)
 {
 if(board[0][j] == 'O') bfs(board, 0, j);
 if(board[m - 1][j] == 'O') bfs(board, m - 1, j);
 }
 for(int i = 0; i < m; i++)
 {
 if(board[i][0] == 'O') bfs(board, i, 0);
 if(board[i][n - 1] == 'O') bfs(board, i, n - 1);
 }
 // 2. 还原 
 for(int i = 0; i < m; i++)
 for(int j = 0; j < n; j++)
 if(board[i][j] == 'O') board[i][j] = 'X';
 else if(board[i][j] == '.') board[i][j] = 'O';
 }
 public void bfs(char[][] board, int i, int j)
 {
 Queue<int[]> q = new LinkedList<>();
 q.add(new int[]{i, j});
 board[i][j] = '.';
 while(!q.isEmpty())
 {
 int[] t = q.poll();
 int a = t[0], b = t[1];
 for(int k = 0; k < 4; k++)
 {
 int x = a + dx[k], y = b + dy[k];
 if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O')
 {
 board[x][y] = '.';
 q.add(new int[]{x, y});
 }
 }
 }
 }
}

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

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

相关文章

Android Stuido中编译信息出现乱码的解决方式

打开菜单File -> Settings&#xff0c;选择Editor -> File Encodings 窗口&#xff0c;将编码设置为正确的字符集&#xff0c;保证 Global Encoding、Project Encoding 和 Default Encoding for properties files 都设置为 UTF-8。

物联网(二)——MDPI特刊推荐

特刊征稿 01 期刊名称&#xff1a; Application of IoT on Manufacturing, Communication and Engineering 截止时间&#xff1a; 摘要提交截止日期&#xff1a;2025年4月30日 投稿截止日期&#xff1a;2025年6月30日 目标及范围&#xff1a; 感兴趣的主题包括但不限于以…

Python输入输出

1、输出 python中变量的输出&#xff0c;print 会自动在行末加上回车,如果不需回车&#xff0c;只需在print语句的结尾添加一个逗号”,“ 1.1、普通输出 print(hello)1.2、格式化输出 1.2.1、使用%来格式化 格式化符号大全 符 号描述%c格式化字符及其ASCII码%s格式化字符…

Visual Studio C# 编写加密火星坐标转换

Visual Studio C# 编写加密火星坐标转换 1、WGS84坐标转GCJ02火星坐标2、GCJ02火星坐标转WGS84坐标&#xff08;回归计算&#xff09;3、GCJ02火星坐标转BD09百度坐标4、BD09百度坐标转GCJ02火星坐标&#xff08;回归计算&#xff09;5、坐标公共转换类6、地图显示7、程序简单界…

Databend 实现高效实时查询:深入解读 Dictionary 功能

作者&#xff1a;洪文丽 开源之夏2024“支持 External Dictionaries”项目参与者 东北大学软件工程专业云计算方向大二在读&#xff0c;喜欢挑战自我&#xff0c;尝试新鲜事物 背景介绍 在大型系统中&#xff0c;数据通常存储在多个不同的数据源中&#xff0c;例如 PostgreSQL…

【设计模式-职责链】

定义 职责链模式是一种行为设计模式&#xff0c;**它通过将请求发送给链上的多个处理者来避免请求发送者与处理者之间的紧密耦合。每个处理者可以选择处理请求或将其传递给链中的下一个处理者。**这样&#xff0c;可以将处理请求的责任链式组织&#xff0c;从而实现更灵活的请…

LeetCode 面试经典150题 66.加一

题目&#xff1a;给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 思路&#xff1a; 代码&…

winform 中 panel 中添加可视对象错位问题

今天在写程序的时候&#xff0c;发现动态添加到panel_wokrarea中的按钮&#xff0c;同样是posx0&#xff0c;有时并不能对齐&#xff0c;会和当前窗口中panel_wokrarea在屏幕上的显示区域的最左边&#xff08;panel_wokrarea很宽&#xff09; 经分析&#xff0c;是因为panel 在…

828华为云征文 | 华为云Flexus X实例在混合云环境中的应用与实践

目录 前言 1. 混合云环境的优势与挑战 1.1 混合云的优势 1.2 混合云的挑战 2. Flexus X实例的配置与集成 2.1 Flexus X实例简介 2.2 Flexus X实例的混合云部署 2.3 配置步骤与措施 3. 数据迁移与同步策略 3.1 数据迁移方案 3.2 数据同步措施 4. 安全性与合规性管理…

我们用等距投影制作了一个动画视频

一家国际网络安全公司委托我们制作一部关于其网络安全产品的解释性视频。为了有效传达产品的价值给潜在客户和利益相关者&#xff0c;我们决定采用等距投影技术制作动画视频。等距投影是一种复杂的视觉呈现方式&#xff0c;它能够让人物和物体看起来具有三维效果&#xff0c;而…

FileLink跨网文件交换|解决网络隔离导致的文件共享难题

在现代企业的运营中&#xff0c;跨网文件交换已经成为一个重要的需求。然而&#xff0c;网络隔离和安全政策往往使得文件共享变得困难。FileLink作为一种创新的解决方案&#xff0c;旨在有效应对这些挑战&#xff0c;提升文件共享效率。 一、网络隔离的挑战 网络隔离常常是出于…

基于ESP8266—AT指令连接阿里云+MQTT透传数据(2)

MQTT_TX设备为发送数据的Topic&#xff0c;使用MQTT-fx软件实现 MQTT_RX设备为接收(订阅)数据的Topic&#xff0c;使用ESP8266通过AT指令实现 一、使用MQTT-fx实现发送数据 首先进入控制台&#xff0c;获取发送设备 “ MQTT_TX ” 的MQTT连接参数&#xff0c;具体具体操作如…

NineData云原生智能数据管理平台新功能发布|2024年9月版

本月发布 3 项更新&#xff0c;其中重点发布 3 项。 重点发布 数据复制 - 新增 Oracle 到 Kafka 复制链路 数据复制功能新增支持将 Oracle 中的数据复制到 Kafka&#xff0c;实现数据的实时流转和分发&#xff0c;支持全量和增量。 数据复制 - 新增库表分组复制 创建复制任务…

电信杯扬帆起航 灵途科技携手中国地质大学推动产学协同创新

近日&#xff0c;由中国地质大学机械与电子信息学院主办的“电信杯”正式启动。作为该校电子信息领域的一项特色创新赛事&#xff0c;此次活动由中国地质大学电子信息工程研创会主办&#xff0c;武汉灵途传感科技有限公司、中建三局智能技术有限公司和武汉盛帆电子股份有限公司…

手把手教你用Python进行Web抓取(附代码)

本教程以在Fast Track上收集百强公司的数据为例&#xff0c;教你抓取网页信息。 作为一名数据科学家&#xff0c;我在工作中所做的第一件事就是网络数据采集。使用代码从网站收集数据&#xff0c;当时对我来说是一个完全陌生的概念&#xff0c;但它是最合理、最容易获取的数据来…

CAN总线的错误类型

前言 CAN总线的错误类型主要包括&#xff1a;位错误、填充错误、格式错误、ACK错误和CRC错误。这里一定要做好CAN总线的错误类型、错误帧类型、节点状态之间的区别。 错误类型是帧传输出错的原因类型&#xff1b;错误帧类型&#xff08;主动错误帧、被动错误帧&#xff09;是帧…

实习问题(配置文件获取参数)

Java中用SpringBoot框架&#xff0c;当我们要获取配置文件yml里的参数时&#xff0c;用Value注解获取 如果配置文件中没有srvSealUploadPath这个参数的话&#xff0c;可以用Value("${srvSealUploadPath:data/idoc/temp}")&#xff0c;这个的意思是&#xff0c;如果配…

【Python入门】20个Python自动化脚本,解放双手、事半功倍

如果你正在学习Python&#xff0c;那么你需要的话可以&#xff0c;点击这里&#x1f449;Python重磅福利&#xff1a;入门&进阶全套学习资料、电子书、软件包、项目源码等等免费分享&#xff01; 在当今的快节奏工作环境中&#xff0c;自动化不再是一种奢侈&#xff0c;而是…

谷歌浏览器完美清除缓存

1.在页面上按下键盘的F12&#xff0c;打开控制台。 2.鼠标放到刷新图标上&#xff0c;点击鼠标右键&#xff0c;选择‘清空缓存并硬性重新加载’。 这样浏览器对网站页面的缓存就彻底被清理干净了。 目前支持该操作方式的浏览器有谷歌和Edge浏览器。 有的浏览器不支持该方式操…

线上热迁移数据库

1、背景 在线平台用的是公司自己的服务器上面搭建的 MongoDB&#xff0c;测试那边反馈珊瑚海平台 MongoDB 有时会掉线&#xff0c;于是计划将本地数据库迁移到云平台。 2、问题所在 1、因为平台测试的同事还在正在使用平台进行测试工作&#xff0c;所以不可能把平台停掉&…