算法练习(八)区域搜索

news2024/12/24 3:30:05

一、腐烂的橘子

1、题目描述: 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:

值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。

返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1

2、示例如下:
在这里插入图片描述
3、代码如下:

class Solution {
    public int orangesRotting(int[][] grid) {
        //边界,长和宽
        int M=grid.length;
        int N=grid[0].length;
        Queue<int[]> queue=new LinkedList<>();

        int count=0;    //新鲜橘子的数量
        for(int i=0;i<M;i++){
            for(int j=0;j<N;j++){
                if(grid[i][j]==1){  
                    count++;    //记录新鲜橘子
                }else if(grid[i][j]==2){
                    queue.add(new int[]{i,j});  //腐烂的橘子也记录下来
                }
            }
        }

        int round=0;    //时间、轮次
        while(count>0&&!queue.isEmpty()){   //当没有新鲜橘子且队列中的腐烂橘子遍历完时退出循环
            round++;
            int n=queue.size();     //记录当前层级的腐烂橘子数量,因为每层都会更新队列
            for(int i=0;i<n;i++){
                int[] orange=queue.poll();  //将当前层最先放入的橘子拿出
                int r=orange[0];
                int c=orange[1];
                if(r-1>=0&&grid[r-1][c]==1){    //更新四周橘子的状态
                    grid[r-1][c]=2;
                    count--;
                    queue.add(new int[]{r-1,c});
                }
                if(r+1<M&&grid[r+1][c]==1){
                    grid[r+1][c]=2;
                    count--;
                    queue.add(new int[]{r+1,c});
                }
                if(c-1>=0&&grid[r][c-1]==1){
                    grid[r][c-1]=2;
                    count--;
                    queue.add(new int[]{r,c-1});
                }
                if(c+1<N&&grid[r][c+1]==1){
                    grid[r][c+1]=2;
                    count--;
                    queue.add(new int[]{r,c+1});
                }
            }
        }

        if(count>0){    //若依然存在新鲜橘子,说明腐烂的橘子不可达
            return -1;
        }else{  //若不存在则输出轮次
            return round;
        }
    }
}

二、查找单入口空闲区域

1、题目描述: 给定一个 m x n 的矩阵,由若干字符 ‘X’ 和 'O’构成,'X’表示该处已被占据,'O’表示该处空闲,请找到最大的单入口空闲区域。

解释:
空闲区域是由连通的’O’组成的区域,位于边界的’O’可以构成入口,单入口空闲区域即有且只有一个位于边界的’O’作为入口的由连通的’O’组成的区域。
如果两个元素在水平或垂直方向相邻,则称它们是“连通”的。

2、示例如下:
在这里插入图片描述
3、代码如下:

import java.util.*;

public class danRuKou {

    public static int m;
    public static int n;
    public static String[][] strings;
    public static int[] rukou=new int[2];   //入口坐标
    public static int count=0;  //入口个数

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        m=sc.nextInt();
        n=sc.nextInt();
        strings=new String[m][n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                strings[i][j]=sc.next();
                //System.out.println(strings[i][j]);
            }
        }
        int max=0;
        List<int[]> quyu=new ArrayList<>();
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(strings[i][j].equals("O")){  //从左上开始遍历寻找第一个为O的坐标
                    strings[i][j]="X";
                    List<int[]> zuobiao=new ArrayList<>();  //保存当前空闲区域的所有坐标
                    zuobiao.add(new int[]{i,j});
                    qiuquyu(i,j,zuobiao);   //求当前空闲区域的所有坐标
                    if(count==1){   //如果入口只有一个则进行比较
                        if(max==zuobiao.size()){    //有大小相同的单入口空闲区域,则只需要大小,无需坐标
                            quyu.clear();
                        }else if(max<zuobiao.size()){   //若有更大的单入口空闲区域,则清除前面的那个,将当前的单入口空闲区域坐标放进去
                            quyu.clear();
                            quyu.add(new int[]{rukou[0],rukou[1],zuobiao.size()});
                            max=zuobiao.size();
                        }
                    }
                    count=0;
                    rukou=new int[2];
                }
            }
        }
        if(quyu.size()==1){ //如果单入口空闲区域只有1个,则直接输出
            int[] res=quyu.get(0);
            System.out.println(res[0]+" "+res[1]+" "+res[2]);
        }else if(max!=0){   //如果最大区域的面积不止为0,则输出最大区域
            System.out.println(max);
        }else { //如果没找到,则输出NULL
            System.out.println("NULL");
        }
    }

    //得到单入口区域
    public static void qiuquyu(int x,int y,List<int[]> list){
        if(x==0||x==m-1||y==0||y==n-1){
            count++;
            rukou[0]=x;
            rukou[1]=y;
        }
        if (x<m-1){
            if(strings[x+1][y].equals("O")){    //因为是按顺序来,所以只需要向右或者向下遍历即可
                strings[x+1][y]="X";
                list.add(new int[]{x+1,y});
                qiuquyu(x+1,y,list);
            }
        }
        if (y<n-1){
            if(strings[x][y+1].equals("O")){
                strings[x][y+1]="X";
                list.add(new int[]{x,y+1});
                qiuquyu(x,y+1,list);
            }
        }
    }
}

三、开心消消乐

1、题目描述: 给定一个N行M列的二维矩阵,矩阵中每个位置的数字取值为0或1。矩阵示例如:
1 1 0 0
0 0 0 1
0 0 1 1
1 1 1 1
现需要将矩阵中所有的1进行反转为0,规则如下:
1)当点击一个1时,该1变被反转为0,同时相邻的上、下、左、右,以及左上、左下、右上、右下8个方向的1(如果存在1)均会自动反转为0;
2)进一步地,一个位置上的1被反转为0时,与其相邻的8个方向的1(如果存在1)均会自动反转为0;
按照上述规则示例中的矩阵只最少需要点击2次后,所有值均为0。请问,给定一个矩阵,最少需要点击几次后,所有数字均为0?

2、示例如下:
在这里插入图片描述

3、代码如下:

import java.util.*;

public class kaiXingXiaoXiaoLe {
    public static int[][] juzhen;
    public static int N;
    public static int M;

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        N=sc.nextInt();
        M=sc.nextInt();
        juzhen=new int[N][M];
        for (int i=0;i<N;i++){  //保存二维数组
            for (int j=0;j<M;j++){
                juzhen[i][j]=sc.nextInt();
            }
        }
        int res=0;
        for (int i=0;i<N;i++){  //开始清除
            for (int j=0;j<M;j++){
                if (juzhen[i][j]==1){
                    clearHappy(i,j);
                    res++;
                }
            }
        }
        System.out.println(res);
    }

    //8个方向都清一遍
    public static void clearHappy(int x,int y){
        if (x>0){
            if(juzhen[x-1][y]==1){  //正上
                juzhen[x-1][y]=0;
                clearHappy(x-1,y);
            }
            if(y>0){
                if(juzhen[x-1][y-1]==1){    //左上
                    juzhen[x-1][y-1]=0;
                    clearHappy(x-1,y-1);
                }
            }
            if(y<M-1){
                if(juzhen[x-1][y+1]==1){    //右上
                    juzhen[x-1][y+1]=0;
                    clearHappy(x-1,y+1);
                }
            }
        }
        if(x<N-1){
            if(juzhen[x+1][y]==1){      //正下
                juzhen[x+1][y]=0;
                clearHappy(x+1,y);
            }
            if(y>0){
                if(juzhen[x+1][y-1]==1){    //左下
                    juzhen[x+1][y-1]=0;
                    clearHappy(x+1,y-1);
                }
            }
            if(y<M-1){
                if(juzhen[x+1][y+1]==1){    //右下
                    juzhen[x+1][y+1]=0;
                    clearHappy(x+1,y+1);
                }
            }
        }
        if(y>0){
            if(juzhen[x][y-1]==1){  //正左
                juzhen[x][y-1]=0;
                clearHappy(x,y-1);
            }
        }
        if(y<M-1){
            if(juzhen[x][y+1]==1){  //正右
                juzhen[x][y+1]=0;
                clearHappy(x,y+1);
            }
        }
    }
}

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

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

相关文章

从零开始:学习使用 Hugo 构建自己的静态网站

1、什么是 Hugo 1.1、简介 Hugo 是一个由 Go 语言编写的静态网站生成器。它可以帮助用户快速构建高性能的静态网站&#xff0c;特别是博客、文档和个人网站等。与其他静态网站生成器相比&#xff0c;Hugo 的特点是速度快、易于使用、可扩展性强等。Hugo 使用简单的 Markdown …

【项目】游戏-我在万科转生成了一只狗

文章目录学习unity一些基操..位置坐标系父子关系常用工具导入游戏模型资源商店创建地形为地形化妆--纹理绘制脚本组件脚本的生命周期脚本执行顺序标签和图层的作用向量的运算和意义欧拉角和四元数-常用C#预制体-类与对象Debug的使用C#物体属性使用游戏时间使用-C#计时器的设置路…

无需手动编码的XGBoost中的分类特征

无需手动编码的XGBoost中的分类特征 XGBoost 是一种基于梯度提升的基于决策树的集成机器学习算法。 然而&#xff0c;直到最近&#xff0c;它还没有原生支持分类数据。 在将分类特征用于训练或推理之前&#xff0c;必须对其进行手动编码。 在序数类别的情况下&#xff0c;例如…

视觉SLAM十四讲ch4 李群和李代数笔记

视觉SLAM十四讲ch4 李群和李代数视觉SLAM十四讲ch4 李群和李代数李群和李代数基础指数映射与对数映射李代数求导与扰动模型视觉SLAM十四讲ch4 李群和李代数 李群和李代数基础 可以将SO3看成旋转矩阵集合&#xff0c;SE3看成变换矩阵集合 李代数是6个自由度的向量空间…

qsort函数的应用以及模拟实现

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:介绍库函数qsort函数的模拟实现和应用 金句分享: ✨追…

Docker之部署Mysql

通过docker对Mysql进行部署。 如果没有部署过docker&#xff0c;看我之前写的目录拉取镜像运行容器开放端口拉取镜像 前往dockerHub官网地址&#xff0c;搜索mysql。 找到要拉取的镜像版本&#xff0c;在tag下找到版本。 拉取mysql镜像&#xff0c;不指定版本数&#xff0c…

04 Android基础--RelativeLayout

04 Android基础--RelativeLayout什么是RelativeLayout&#xff1f;RelativeLayout的常见用法&#xff1a;什么是RelativeLayout&#xff1f; 相对布局&#xff08;RelativeLayout&#xff09;是一种根据父容器和兄弟控件作为参照来确定控件位置的布局方式。 根据父容器定位 在相…

JavaWeb--RequestResponse

Request&Response1 Request和Response的概述2 Request对象2.1 Request继承体系2.2 Request获取请求数据2.2.1 获取请求行数据2.2.2 获取请求头数据2.2.3 获取请求体数据2.2.4 小结2.2.5 获取请求参数的通用方式2.3 IDEA快速创建Servlet2.4 请求参数中文乱码问题2.4.1 POST请…

智能家居Homekit系列一智能通断开关

智能通断器&#xff0c;也叫开关模块&#xff0c;可以非常方便地接入家中原有开关、插座、灯具、电器的线路中&#xff0c;通过手机App或者语音即可控制电路通断&#xff0c;轻松实现原有家居设备的智能化改造。 随着智能家居概念的普及&#xff0c;越来越多的人想将自己的家改…

WebRTC系列分享 | WebRTC视频QoS全局技术栈

概述目前总结出WebRTC用于提升QoS的方法有&#xff1a;NACK、FEC、SVC、JitterBuffer、IDR Request、Pacer、Sender Side BWE、Probe、VFR&#xff08;动态帧率调整策略&#xff09;、AVSync&#xff08;音视频同步&#xff09;、动态分辨率调整。这几种方法在WebRTC架构分布如…

上海亚商投顾:沪指窄幅震荡 ChatGPT概念再度走高

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪沪指今日窄幅震荡&#xff0c;创业板指低开低走&#xff0c;午后跌幅扩大至1%&#xff0c;宁德时代一度跌近4%。6G概…

【架构师】零基础到精通——微服务治理

博客昵称&#xff1a;架构师Cool 最喜欢的座右铭&#xff1a;一以贯之的努力&#xff0c;不得懈怠的人生。 作者简介&#xff1a;一名Coder&#xff0c;软件设计师/鸿蒙高级工程师认证&#xff0c;在备战高级架构师/系统分析师&#xff0c;欢迎关注小弟&#xff01; 博主小留言…

【java基础】一篇文章彻底搞懂lambda表达式

文章目录lambda表达式是什么lambda表达式的语法函数式接口初次使用深入理解方法引用 :: 用法快速入门不同形式的::情况1 object::instanceMethod情况2 Class::instanceMethod情况3 Class::staticMethod对于 :: 的一些示例及其注意事项构造器引用变量作用域使用外部变量定义内部…

web自动化 基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架

1、 开发环境 win7 64 PyCharm 4.0.5 setuptools-29.0.1.zip 下载地址&#xff1a;setuptools-29.0.1.zip_免费高速下载|百度网盘-分享无限制 官方下载地址&#xff1a;setuptools PyPI python 3.3.2 mysql-connector-python-2.1.4-py3.3-win64 下载地址&#xff1a;mysq…

企业 Active Directory 自助服务

您的企业是否正在寻找一个全面的 Active Directory 自助服务解决方案&#xff0c;使用户能够在没有帮助台帮助的情况下满足自己的 Active Directory 需求&#xff1f;ADSelfService Plus 了解您的安全问题&#xff0c;并提供基于审批的自助服务工作流功能&#xff0c;使管理员能…

内网vCenter部署教程一

PS&#xff1a;因为交换机链路为trunk&#xff0c;安装先登录ESXI&#xff0c;将端口组改为管理vlan ID&#xff08;1021&#xff09; 一、双击镜像&#xff0c;打开文件夹&#xff0c;目录为F:\vcsa-ui-installer\win32&#xff0c;双击installer.exe 二、先设置语言为中文 三…

机器学习笔记之狄利克雷过程(三)随机测度的生成过程(折棍子过程)

机器学习笔记之狄利克雷过程——随机测度的生成过程[折棍子过程]引言回顾&#xff1a;狄利克雷过程——定义随机测度的生成过程从随机测度的生成过程观察标签参数α\alphaα与随机测度离散程度之间的关系引言 上一节使用公式推导的方式介绍了狄利克雷过程中标量参数α\alphaα…

云服务器ECS 什么是云服务器ECS?

云服务器ECS&#xff08;Elastic Compute Service&#xff09;是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS&#xff08;Infrastructure as a Service&#xff09;级别云计算服务。 云服务器ECS免去了您采购IT硬件的前期准备&#xff0c;让您像使用水、电、天然气等公共…

【线性DP】猴子与香蕉

可恶&#xff0c;就差一点就能独立写出这道题了&#xff01;4548. 猴子和香蕉 - AcWing题库题意&#xff1a;思路&#xff1a;设计状态的时候一开始不知道怎么设&#xff0c;后来试了一下发现这样设很合理因此在设状态的时候很多时候都要试一试当时间或空间吃不消时&#xff0c…

django ModelForm外鍵問題

背景 django在使用ModelForm時如果存在外鍵字段&#xff0c;默認是ChoiceField讓你選擇外鍵關聯表有的值&#xff0c;但是如果關聯表的數據很多的話選擇就很難找到選項。所以想能不能換成輸入框TextInput。 舉個例子 models.py 這裏建了兩個表&#xff0c;把用戶表的name作…