图论系列(dfs)9.25

news2024/9/26 14:54:20

一、主题空间
 

场地由若干主题空间与走廊组成,场地的地图记作由一维字符串型数组 grid,字符串中仅包含 "0"~"5" 这 6 个字符。地图上每一个字符代表面积为 1 的区域,其中 "0" 表示走廊,其他字符表示主题空间。相同且连续(连续指上、下、左、右四个方向连接)的字符组成同一个主题空间。

假如整个 grid 区域的外侧均为走廊。请问,不与走廊直接相邻的主题空间的最大面积是多少?如果不存在这样的空间请返回 0

输入:grid = ["11111100000","21243101111","21224101221","11111101111"]

输出:3

解释:8 个主题空间中,有 5 个不与走廊相邻,面积分别为 3、1、1、1、2,最大面积为 3。

image.png

思路:

题目中要求不与走廊直接相邻的主题空间的最大面积。最外层和0都是走廊。

在dfs深搜的函数中:

第一种情况:如果x在第一行或者最后一行,或者y在第一列或者最后一列(这样就意味着与走廊直接相邻了),count=-999999。

第二种情况:如果arr[x][y]=0,也代表与走廊直接相邻了,count=-999999;

        if (x == 0 || x == arr.length - 1 || y == 0 || y == arr[0].length - 1)
            count = -999999;

第三种情况: 相邻的点满足不与走廊相连,但是arr[x][y]!=target,这样count=-999999;

        if (x != 0) {
            if (arr[x - 1][y] == target) {
                count += dfs(x - 1, y, target);
            } else if (arr[x - 1][y] == 0) {
                count = -999999;
            }
        }

判断上下左右四个分支。(四叉树) 

代码:
class Solution {
    int[][] arr;
    public int largestArea(String[] grid) {
        arr = new int[grid.length][grid[0].length()];
        // 转换为int网格
        for (int i = 0; i < arr.length; i++) {
            String str = grid[i];
            for (int j = 0; j < arr[0].length; j++) {
                arr[i][j] = str.charAt(j) - '0';
            }
        }
        // dfs网格
        int res=0;
        for (int i = 1; i < arr.length; i++) {
            for (int j = 1; j < arr[0].length; j++) {
                if(arr[i][j]>0&&arr[i][j]<=5){
                    res=Math.max(res,dfs(i,j,arr[i][j]));
                }
            }
        }
        return res;
    }

    public int dfs(int x, int y, int target) {
        arr[x][y] = arr[x][y] * -1;
        int count = 1;
        // 先判断是否在边界
        if (x == 0 || x == arr.length - 1 || y == 0 || y == arr[0].length - 1)
            count = -999999;
        // 上边进行讨论
        if (x != 0) {
            if (arr[x - 1][y] == target) {
                count += dfs(x - 1, y, target);
            } else if (arr[x - 1][y] == 0) {
                count = -999999;
            }
        }
        // 下边进行讨论
        if (x != arr.length - 1) {
            if (arr[x + 1][y] == target) {
                count += dfs(x + 1, y, target);
            } else if (arr[x + 1][y] == 0) {
                count = -999999;
            }
        }
        // 左边进行讨论
        if (y != 0) {
            if (arr[x][y - 1] == target) {
                count += dfs(x, y - 1, target);
            } else if (arr[x][y - 1] == 0) {
                count = -999999;
            }
        }
        //
        if (y != arr[0].length-1) {
            if (arr[x][y + 1] == target) {
                count += dfs(x, y + 1, target);
            } else if (arr[x][y + 1] == 0) {
                count = -999999;
            }
        }
        return count;
    }
}

二、飞地的数量

给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。

一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。

返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。

示例 1:

输入:grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
输出:3
解释:有三个 1 被 0 包围。一个 1 没有被包围,因为它在边界上
思路:

我们可以将与边界相连的陆地都标记一下,因为与边界相连的陆地连通块是可以到达的。剩下的陆地就是无法到达边界的。

那么如何标记可以到达的陆地呢?我们可以遍历第一行、最后一行、第一列、最后一列的数,如果他们的值是1,就把值修改掉,然后继续dfs搜索。

代码:
class Solution {
    public int numEnclaves(int[][] grid) {
        //对第0行和第n-1行淹没
        for (int i = 0; i < grid[0].length; i++) {
            dfs(grid, 0, i);
            dfs(grid,grid.length-1,i);
        }
        //对第0列和第n-1列淹没
        for (int i = 0; i < grid.length; i++) {
            dfs(grid, i, 0);
            dfs(grid,i,grid[0].length-1);
        }
        int count=0;
        for(int i=0;i<grid.length;i++){
            for(int j=0;j<grid[0].length;j++){
                if(grid[i][j]==1)count++;
            }
        }
        return count;
    }

    public void dfs(int[][] grid,int x,int y){
        if(grid[x][y]==0)return;
        grid[x][y]=0;
        if(x>0)dfs(grid,x-1,y);
        if(x<grid.length-1)dfs(grid,x+1,y);
        if(y>0)dfs(grid,x,y-1);
        if(y<grid[0].length-1)dfs(grid,x,y+1);
    }
}

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

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

相关文章

B站批量删除动态—Python

B站协议批量删除动态实现 b站登录协议请看点方蓝色字体 b站扫码登录协议 文章结尾附Python代码 一、抓包 1.1删除动态包 POST请求 https://api.bilibili.com/x/dynamic/feed/operate/remove?platformweb&csrf3bdb2bda73e3d6f75ea991167fb39389 请求表单数据{&quo…

基于python+django+vue的电影数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

exebios提取工具通用exebios分离工具exe转编程器bios文件软件bios文件解密提取工具exe原厂bios提取烧录器bios芯片文件工具

好多电脑官网下载的BIOS文件是exe格式的特别是笔记本电脑&#xff0c;自己把电脑bios刷坏了黑屏不开机&#xff0c;需要用编程器刷BIOS&#xff0c;自然需要编程器版本的BIOS文件 需要把exe格式的BIOS文件转换成bin格式的编程器版本BIOS文件&#xff0c;转换需要用到一个小工具…

RAG技术全面解析:Langchain4j如何实现智能问答的跨越式进化?

LLM 的知识仅限于其训练数据。如希望使 LLM 了解特定领域的知识或专有数据&#xff0c;可&#xff1a; 使用本节介绍的 RAG 使用你的数据对 LLM 进行微调 结合使用 RAG 和微调 1 啥是 RAG&#xff1f; RAG 是一种在将提示词发送给 LLM 之前&#xff0c;从你的数据中找到并…

企业图纸文档管理系统推荐 三大企业图纸文档管理软件详细介绍

在现代企业的设计和生产过程中&#xff0c;图纸文档的管理是至关重要的一环。 无论是建筑、制造业&#xff0c;还是技术研发领域&#xff0c;图纸文档的正确存储、分享与管理能够极大提升工作效率&#xff0c;避免误操作或信息丢失。 接下来&#xff0c;小编将为大家推荐三款优…

8606 二叉树的构建及遍历操作

### 伪代码 1. **CreateBiTree**: - 读取一个字符 ch。 - 如果 ch 是 #&#xff0c;则当前节点为空。 - 否则&#xff0c;创建一个新节点 T&#xff0c;将 ch 赋值给 T 的数据域。 - 递归创建 T 的左子树。 - 递归创建 T 的右子树。 2. **PreOrderTraverse**: …

15 Midjourney从零到商用·实战篇:建筑设计与室内设计

以前设计师生成一张效果图需要先画草稿&#xff0c;导入三维软件搭建场景后&#xff0c;再用渲染器渲染&#xff0c;而现在只需要有客户的意向图或者自己想法&#xff0c;在MidJourney中就能一键生成惊艳的效果图。 “给我一个prompt我能撬动整个设计界”。设计师在AI绘画面前似…

安卓系统常见问题如native crash,卡顿卡死定位工具命令技巧-android framework实战开发

背景&#xff1a; 有学员朋友近来有问到一些安卓系统开发过程中的一些核心小技能小技巧等&#xff0c;比如native crash在企业里面该如何准确定位具体代码函数&#xff0c;程序卡住&#xff0c;或者长时间没反应&#xff0c;想要看看卡在代码的哪里。针对以上的一些问题&#…

中电金信:源启智能视觉分析系统~助力各行业破局升级,释放新质生产力

作为人工智能与计算机视觉的交叉范畴&#xff0c;智能视觉模仿人类视觉机能&#xff0c;来对各种形式的视觉输入予以处理、理解以及决策。当下&#xff0c;智能视觉已然发展为应用广泛、市场覆盖面大且形式多元的产业方向&#xff0c;获得了国家政策的强力支持。数字化时代搭台…

开源模型应用落地-qwen2.5-7b-instruct-LoRA微调-LLaMA-Factory-单机单卡-V100(十八)

一、前言 本篇文章将使用LLaMA-Factory去高效微调(命令和界面方式)QWen2.5系列模型,通过阅读本文,您将能够更好地掌握这些关键技术,理解其中的关键技术要点,并应用于自己的项目中。 QWen2系列模型微调: 开源模型应用落地-qwen2-7b-instruct-LoRA微调-LLaMA-Factory-单机单…

MySQL Mail服务器集成:如何配置发送邮件?

MySQL Mail插件使用指南&#xff1f;怎么优化 MySQL发邮件性能&#xff1f; MySQL Mail服务器的集成&#xff0c;使得数据库可以直接触发邮件发送&#xff0c;极大地简化了应用架构。AokSend将详细介绍如何配置MySQL Mail服务器&#xff0c;以实现邮件发送功能。 MySQL Mail&…

IDEA相关设置总结

目录 1.设置JDK 2.设置忽略大小写检查 3.设置字体大小 4.设置类的信息 5.包名分级 1.设置JDK 2.设置忽略大小写检查 3.设置字体大小 4.设置类的信息 5.包名分级 取消勾选

利用低代码快速搭建电商小程序之商品列表页

目标&#xff1a; 搭建商城的一个商品列表页面&#xff08;先做静态页&#xff09; 开发环境&#xff1a; 访问白码低代码平台&#xff1a;https://www.bnocode.com/ 白码的新自定义页功能&#xff08;使用vue框架&#xff09; 前期准备&#xff1a; 需要先准备商品数据表…

数据结构:Heap堆应用(堆排序,TOP-K问题)手把手带你入门数据结构~

文章目录 前言一、堆排序1. 数据入堆2. 堆排序3. 时间复杂度&#xff08;1&#xff09;冒泡排序时间复杂度&#xff08;2&#xff09;向上调整建堆的时间复杂度&#xff08;3&#xff09;向下调整建堆的时间复杂度 4. 堆排序总结 二、TOP-K问题1. TOP-K问题背景2. TOP-K问题解决…

【日记】感觉自己已经魔怔了(817 字)

正文 下午装档案的时候&#xff0c;无意间朝外看了一眼&#xff0c;发现自己视力衰退了好多。感觉两只眼睛都有散光了&#xff0c;看东西有重影。有些担心。 兄长血检报告出来了&#xff0c;血红蛋白高&#xff0c;肌酐低。尿酸倒是正常了&#xff0c;但总体还是偏高。我觉得好…

408解题小助手—文心智能体

体验链接&#xff1a;408解题小助手 问题&#xff1a; 个字符有如下 种编码方案&#xff0c;不是前缀编码的是 A. 01 0000 0001 001 1 B. 011, 000, 001, 010, 1 C. 000, 001, 010, 011, 100 D. 0, 100, 110, 1110, 1100 回答&#xff1a; 不是前缀编码的是选项 D&#xff1a;0…

Java项目: 基于SpringBoot+mybatis+maven实现的智能推荐卫生健康系统分前后台(含源码+数据库+开题报告+任务书+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven实现的智能推荐卫生健康系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美…

C++ —— 关于list

目录 链接 前言 1. 迭代器浅解 2. 接口 2.1 构造函数 2.2 push_back 2.3 emplace_back 2.4 insert 2.5 erase 2.6 reverse 2.7 sort 2.8 merge 2.9 unique 2.10 splice 链接 cplusplus.com/reference/list/list/?kwlisthttps://cplusplus.com/reference/list/list…

MSF工具使用教程

Metasploit 简介 Metasploit 是一个漏洞框架&#xff0c;拥有超过 1700 个漏洞利用程序&#xff0c;大大简化了渗透测试的工作&#xff0c;同时具有模块化的体系结构&#xff0c;渗透测试人员可以很方便的添加或修改exploit。 安装及维护 安装 使用 Rapid7 的一套快速安装项…

js逆向--某建筑市场公共监管服务平台

js逆向--某建筑市场公共监管服务平台 一、抓包二、断点调试三、写代码一、抓包 很容易找到数据接口,发现响应加密了。 二、断点调试 打开源代码/来源界面,下一个XHR断点。 点击翻页,发现代码断住了。 发现到下图中的位置时,明文出现了。 点击上图中的图标进入b方法,找…