【BFS专题】— BFS解决FloodFill算法

news2024/11/25 0:21:34

1、  图像渲染 - 力扣(LeetCode)

思路:

  1. 代码:
    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) {
            //统计刚开始[sr,sc]坐标位置的颜色
            int prev = image[sr][sc];
            //处理便捷情况
            if(prev == color){
                return image;
            }
            int m = image.length;
            int 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];
                int b = t[1];
                image[a][b] = color;
                //上下左右四个方向
                for(int i = 0; i < 4; i++){
                    int x = a + dx[i];
                    int 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;
        }
    }

 2、岛屿数量 - 力扣(LeetCode)

思路:

  1. 寻找相同的连通块,bfs算法,
  2. 可以找到1之后,就1修改成0,避免重复
  3. 也可以找到1之后将状态改成true
  4. 代码:
    class Solution {
        //创建全局变量
        int[] dx = {0, 0, 1, -1};
        int[] dy = {1, -1, 0, 0};
        //创建一个数组标记该位置下的状态
        boolean[][] vis;
        int m, n;
        public int numIslands(char[][] grid) {
            m = grid.length;
            n = grid[0].length;
            vis = new boolean[m][n];
            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] == false){
                        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] == false){
                        //添加到队列并且更新状态
                        q.add(new int[]{x,y});
                        vis[x][y] = true;
                    }
                }
            }
            
        }
    }

 3、岛屿的最大面积 - 力扣(LeetCode)

 

思路:

  1. 遇上一题的思路一样,只不过是加了一个count来统计最大面积的大小
  2. class Solution {
        int[] dx = {0, 0, 1, -1};
        int[] dy = {1, -1, 0, 0};
        boolean[][] vis;
        int n, m;
        public int maxAreaOfIsland(int[][] grid) {
            m = grid.length;
            n = grid[0].length;
            vis = new boolean[m][n];
            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 = Math.max(ret, bfs(grid, i, j));
                    }
                }
            }
            return ret;
        }
    
        public int bfs(int[][] g, int i, int j){
            int count = 0;
            Queue<int[]> q = new LinkedList<>();
            q.add(new int[]{i,j});
            //对传入的坐标的状态进行初始化
            vis[i][j] = true;
            count++;
            while(!q.isEmpty()){
                int[] t = q.poll();
                int a = t[0];
                int b = t[1];
                for(int k = 0; k < 4; k++){
                    int x = a + dx[k];
                    int y = b + dy[k];
                    if(x >= 0 && x < m && y >= 0 && y < n && g[x][y] == 1 && !vis[x][y]){
                        q.add(new int[]{x,y});
                        vis[x][y] = true;
                        count++;
                    }
                }
            }
            return count;
        }
    }

 4、被围绕的区域 - 力扣(LeetCode)

思路:

  1. 我们先用bfs将边界的O给修改成  点
  2. 然后再开始修改全部被包围的O
  3. 最后把点还原成 O
  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 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);
                }
            }
            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);
                }
            }
    
            //2、还原 O
            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[][] b, int i, int j){
            Queue<int[]> q = new LinkedList<>();
            q.offer(new int[] {i,j});
            b[i][j] = '.';
    
            while(!q.isEmpty()){
                int[] t = q.poll();
                int a = t[0];
                int b1 = t[1];
                for(int k = 0; k < 4; k++){
                    int x = a + dx[k];
                    int y = b1 + dy[k];
                    if(x >= 0 && x < m && y >= 0 && y < n && b[x][y] == 'O'){
                        b[x][y] = '.';
                        q.offer(new int[] {x, y});
                    }
                }
            }
        }
    }

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

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

相关文章

C++当中的多态(三)

&#xff08;六&#xff09;虚表的本质 其实我们大家应该都已经猜到了&#xff1a;我们虚表的本质就是一个函数指针数组。通过访问这个函数指针数组就可以得到我们想要的虚函数的地址&#xff0c;之后通过这个地址就可以调用我们相应的虚函数。我们这个函数指针数组是以nullptr…

开发者的噩梦:如何在抄袭狂潮中杀出一条血路?

开发者的噩梦&#xff1a;如何在抄袭狂潮中杀出一条血路&#xff1f; 作为一个独立开发者&#xff0c;辛辛苦苦打磨出的产品&#xff0c;一旦被别人抄袭&#xff0c;心中往往会涌现出无数的愤怒与无奈。看到自己的创意被别人肆意剽窃&#xff0c;并以此获利&#xff0c;谁能不…

【HTML】Html标签

目录 结构盒子div 标签语义化标签 文本p 段落标签h 标题标签span 行内标签a 超链接标签br 换行标签、hr水平线标签sub 下标字、sup 上标字strong 或 b 加粗、em 或 i 斜体、del 或 s 删除线、ins 或 u 下划线 列表ul 无序列表ol 有序列表dl 自定义列表列表嵌套 表格table 标签合…

【Gateway】网关服务快速上手

微服务的接口都是直接对外暴露的,可以直接通过外部访问,为了保证对外服务的安全性服务端实现的微服务接口通常都带有一定的权限校验机制,由于使用了微服务,原本一个应用的的多个模块拆分成了多个应用,我们不得不实现多次校验逻辑,当这套逻辑需要修改时,我们需要修改多个应用,加…

【4.2】图搜索算法-DFS和BFS解单词拆分

一、题目 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict&#xff0c;判定 s 是否可以被空格拆分 为一个或多个在字典中出现的单词。 说明&#xff1a; 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1&#xff1a; 输入: s "le…

【2024-09-12】某极验4流程分析-滑块验证码

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、流程分析三、参数分析三、代码一、前言 极验四代滑块没有了滑动轨迹的验证,来看一下 网址:aHR0cHM6Ly9n…

机器学习中的内存优化

随着机器学习模型的复杂性不断增加&#xff0c;内存使用量也随之增长&#xff0c;因此&#xff0c;内存优化变得尤为重要。 机器学习内存足迹 机器学习模型通常由数据结构如张量和矩阵组成。例如&#xff0c;一个形状为(1000, 1000)&#xff0c;每个元素为32位浮点数的二维张量…

TypeScript中 any和unknown 的区别

1、给其他变量赋值 any可以给其他类型的变量重新赋值&#xff1b; 但unknown是不行的&#xff0c;unknown 可以保持类型安全&#xff0c;从而减少潜在的错误&#xff1b; 2、使用类型上的方法 any可以用类型上的方法&#xff0c;unknown是不可以的

golang 字符串浅析

go的字符串是只读的 测试源代码 package mainimport ("fmt""unsafe" )func swap(x, y string) (string, string) {return y, x }func print_string(obj *string, msg string) {string_ptr : (*[2]uintptr)(unsafe.Pointer(obj))first_obj_addr : string_…

AI在医学领域:医学AI的安全与隐私全面概述

随着技术的进步&#xff0c;软件系统在商业产品中扮演着越来越重要的角色&#xff0c;并在医疗领域变得不可或缺。人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;的发展已经彻底改变了现代医疗系统&#xff0c;为通过病人诊断、监测和医疗保健研究收…

[机器学习]KNN算法

1 KNN算法简介 KNN算法思想&#xff1a;如果一个样本在特征空间中的K个最相似的样本中的大多数属于某一个类别&#xff0c;则该样本也属于这个类别。 K值过小&#xff1a;用较小领域中的训练实例进行预测。 容易受到异常点的影响K值的减小意味着整体模型变得复杂&#xff0c;容…

Tableau学习日记

Day1&#xff1a;Tableau简介、条形图与直方图 1.Tableau绘制条形图 1.1 条形图1&#xff1a;各地区酒店数量 1.2 条形图2&#xff1a;各地区酒店均价 1.3 堆积图&#xff1a;价格等级堆积图 2.Tableau绘制直方图 2.1创建评分直方图 Day2&#xff1a;Tableau简介、条形图与直…

c# resource en-US

这里主要是做中英文语言包切换的&#xff0c;非常简单

Java教程:SE进阶【十万字详解】(上)

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

c++11新特性——endable_shared_from_this

文章目录 一.解决场景代码示例原因 二.解决办法代码 三.底层原理 一.解决场景 一个share_ptr管理的类&#xff0c;如果从类的函数里返回类对象&#xff08;this指针&#xff09;&#xff0c;导致share_ptr引用计数错误&#xff0c;析构时异常问题 代码示例 #include <mem…

最近试用了FunHPC-AI宝箱-ComfyUI-Plus,使用了dreamshaperXL全能模型,生成了几张国风图,效果真的让人惊叹!

最近试用了FunHPC-AI宝箱-ComfyUI-Plus&#xff0c;使用了dreamshaperXL全能模型&#xff0c;生成了几张国风图&#xff0c;效果真的让人惊叹&#xff01;&#x1f338; https://www.funhpc.com/#/ 通过简单的提示词&#xff0c;我就能轻松生成出充满古韵的图像&#xff1a;汉服…

linux查看外网ipv4地址

在Linux系统中&#xff0c;可以使用以下几种方法来查看外网IPv4地址&#xff0c;并确保强制使用IPv4。 前言 特别感谢浪浪云对本文的大力支持。浪浪云作为领先的云计算服务提供商&#xff0c;凭借其卓越的性能和可靠性&#xff0c;帮助无数企业和开发者实现了业务的快速部署和…

苹果宣布iOS 18正式版9月17日推送:支持27款iPhone升级

9月10日消息&#xff0c;在苹果秋季发布会结束后&#xff0c; 苹果宣布将于9月17日(下周二)推送iOS 18正式版系统。 苹果官网显示&#xff0c;iOS 18正式版将兼容第二代iPhone SE及之后的所有机型&#xff0c;加上刚发布的iPhone 16系列&#xff0c;共兼容27款iPhone。 iOS 18升…

为拖延症量身定制的AI工具,让Kimi做我的《每日信息整理助手》

AI不止对传统行业带来巨大的改变&#xff0c;对日常生活也便利了不少&#xff0c;现在这个时代获取信息的方式太简单了。 我们每天都会接受大量的信息&#xff0c;难免一天下来会忘记很多事情&#xff0c;有时候突然想起了一个点子&#xff0c;有时候突然有一件急事、一件待办事…

基于SpringBoot+Vue的校园失物招领系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的校园失物…