算法打卡:第十一章 图论part02

今日收获:岛屿数量(深搜),岛屿数量(广搜),岛屿的最大面积

1. 岛屿数量(深搜)

题目链接:99. 岛屿数量

思路:二维遍历数组,先判断当前节点是否被访问过&是否是陆地。如果满足条件则岛屿数量加1,再通过深度优先遍历将其上下左右的陆地设置为访问过。

        注意:每次传入dfs函数的节点都是符合结果收集条件的,所以不用写结束条件。也可以将判断条件(访问过/不是陆地)写入dfs的结束条件中。

方法:

import java.util.Scanner;public class Main{static int[][] around={{0,1},{-1,0},{0,-1},{1,0}};public static void main(String[] args){// 收集输入Scanner sc=new Scanner(System.in);int N=sc.nextInt();int M=sc.nextInt();int[][] grid=new int[N][M];for (int i=0;i<N;i++){for (int j=0;j<M;j++){grid[i][j]=sc.nextInt();}}int result=0;int[][] visited=new int[N][M];  // 是否访问过for (int i=0;i<N;i++){for (int j=0;j<M;j++){if (visited[i][j]==0 && grid[i][j]==1){  // 没有访问过并且是陆地result++;visited[i][j]=1;dfs(visited,i,j,grid);  // 标记其上下左右的陆地}}}System.out.println(result);}public static void dfs(int[][] visited,int x,int y,int[][] grid){for (int i=0;i<4;i++){int nextX=x+around[i][0];int nextY=y+around[i][1];// 周围坐标在合法范围内if (nextX<0||nextY<0||nextX>=grid.length||nextY>=grid[0].length){continue;  // 找下一个坐标}if (visited[nextX][nextY]==0&&grid[nextX][nextY]==1){visited[nextX][nextY]=1;dfs(visited,nextX,nextY,grid);}}}
}

2. 岛屿数量(广搜)

题目链接:99. 岛屿数量

思路:利用队列存储当前节点。当队列不为空时,从队列中取出节点作为当前遍历的节点,然后再将当前节点中符合条件的节点加入队列,同时访问位设为1

方法:

import java.util.Scanner;
import java.util.Queue;
import java.util.LinkedList;public class Main{static int[][] around={{0,1},{-1,0},{0,-1},{1,0}};public static void main(String[] args){// 收集输入Scanner sc=new Scanner(System.in);int N=sc.nextInt();int M=sc.nextInt();int[][] grid=new int[N][M];for (int i=0;i<N;i++){for (int j=0;j<M;j++){grid[i][j]=sc.nextInt();}}int result=0;int[][] visited=new int[N][M];  // 是否访问过for (int i=0;i<N;i++){for (int j=0;j<M;j++){if (visited[i][j]==0 && grid[i][j]==1){  // 没有访问过并且是陆地result++;visited[i][j]=1;bfs(visited,i,j,grid);  // 标记其上下左右的陆地}}}System.out.println(result);}// 广度优先搜索public static void bfs(int[][] visited,int x,int y,int[][] grid){Queue<int[]> queue=new LinkedList<>();queue.offer(new int[]{x,y});while (!queue.isEmpty()){int curX=queue.peek()[0];int curY=queue.poll()[1];// 遍历当前节点的周围节点for (int i=0;i<4;i++){int nextX=curX+around[i][0];int nextY=curY+around[i][1];// 周围坐标在合法范围内if (nextX<0||nextY<0||nextX>=grid.length||nextY>=grid[0].length){continue;  // 找下一个坐标}if (visited[nextX][nextY]==0&&grid[nextX][nextY]==1){visited[nextX][nextY]=1;queue.offer(new int[]{nextX,nextY});}}}}
}

3. 岛屿的最大面积

题目链接:100. 岛屿的最大面积

(1)深度优先遍历

思路:主函数中两层遍历的 if 判断可以当作是一个新岛屿的开始。即深度优先遍历函数返回之后,当前节点连通的岛屿节点就已经全部遍历完毕了。

方法:

import java.util.Scanner;public class Main{static int[][] around={{0,1},{-1,0},{0,-1},{1,0}};static int current;public static void main(String[] args){Scanner sc=new Scanner(System.in);int N=sc.nextInt();int M=sc.nextInt();int[][] grid=new int[N][M];for (int i=0;i<N;i++){for (int j=0;j<M;j++){grid[i][j]=sc.nextInt();}}int result=0;int[][] visited=new int[N][M];for (int i=0;i<N;i++){for (int j=0;j<M;j++){if (visited[i][j]==0&&grid[i][j]==1){current=0;  // 当前节点连通岛屿的面积visited[i][j]=1;dfs(visited,i,j,grid);result=Math.max(result,current);}}}System.out.println(result);}public static void dfs(int[][] visited,int x,int y,int[][] grid){current++;for (int i=0;i<4;i++){int nextX=x+around[i][0];int nextY=y+around[i][1];if (nextX<0||nextY<0||nextX>=grid.length||nextY>=grid[0].length){continue;}if (visited[nextX][nextY]==0&&grid[nextX][nextY]==1){visited[nextX][nextY]=1;dfs(visited,nextX,nextY,grid);}}}
}

 总结:递归函数中如果是求和求面积,最好把参数写在外面不容易搞混,还可以减少递归函数的参数。

(2)广度优先遍历

思路:主函数中遍历到符合条件的节点可以看作是岛屿的起点,在一次广度优先函数运行的过程中,队列添加过的元素就是这个岛屿的所有节点。因此在每次往队列中添加节点时,当前岛屿的面积就加1。

方法:

import java.util.Scanner;
import java.util.Queue;
import java.util.LinkedList;public class Main{static int[][] around={{0,1},{-1,0},{0,-1},{1,0}};public static void main(String[] args){Scanner sc=new Scanner(System.in);int N=sc.nextInt();int M=sc.nextInt();int[][] grid=new int[N][M];for (int i=0;i<N;i++){for (int j=0;j<M;j++){grid[i][j]=sc.nextInt();}}int result=0;int[][] visited=new int[N][M];for (int i=0;i<N;i++){for (int j=0;j<M;j++){if (visited[i][j]==0&&grid[i][j]==1){result=Math.max(result,bfs(visited,i,j,grid));}}}System.out.println(result);}public static int bfs(int[][] visited,int x,int y,int[][] grid){int current=0;Queue<int[]> queue=new LinkedList<>();visited[x][y]=1;queue.offer(new int[]{x,y});  // 当前这块岛屿的起点current++;while (!queue.isEmpty()){int currX=queue.peek()[0];int currY=queue.poll()[1];for (int i=0;i<4;i++){int nextX=currX+around[i][0];int nextY=currY+around[i][1];if (nextX<0||nextY<0||nextX>=grid.length||nextY>=grid[0].length){continue;}// 满足条件加入队列,且当前岛屿面积+1if (visited[nextX][nextY]==0&&grid[nextX][nextY]==1){visited[nextX][nextY]=1;current++;queue.offer(new int[]{nextX,nextY});}}}return current;}
}

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

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

相关文章

使用scp命令从本地往服务器传输文件失败

解决办法&#xff1a; 找到这个文件&#xff0c;打开&#xff0c;将里面的服务器ip对应的一行数据删掉即可。

【Python报错已解决】To update, run: python.exe -m pip install --upgrade pip

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

麒麟操作系统快捷键设置

这些是银河麒麟操作系统常用的快捷键&#xff0c;和Windows系统有点儿相似。 但也有一些快捷键为未列出来&#xff0c;如CtrlALTT打开终端&#xff0c;Ctrld关闭终端&#xff0c;F2&#xff1a;重命名&#xff1b; CtrlshiftN&#xff1a;新建文件夹。

虚拟机ens33网卡不显示inet地址(已设置NOBOOT为yes)

在虚拟机中输入ifconfig或ip addr时&#xff0c;出现如下情况&#xff1a; sudo dhclient ens33sudo ifconfig ens33依次执行上面两行&#xff0c;之后发现ens33中可以显示inet了 本虚拟机的地址就是192.168.244.131

ABAP 一步一步教你添加ALV界面菜单功能按钮

ABAP 一步一步教你添加菜单功能按钮。 程序里面找到这个组件小按钮 就可以看到GUI状态了。 在修改GUI STATUS 是如果要添加一个功能按钮&#xff0c;必须先创建一个功能键&#xff08;具体参照下方&#xff09;&#xff0c;之后再在应用程序工具栏输入该功能键的功能码否则报…

Windows上创建批处理.bat文件并且注册为开机自启(Python-web微服务)

1. winodws桌面点击创建文本文件 &#xff08;文件名称.txt&#xff09; 2. 将如下代码写入txt文件中 echo off if "%1""h" goto begin start mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h"…

百元学生党头戴式耳机选哪个?四款热门天花板机型推荐

当前市场上&#xff0c;耳机产品的竞争愈发激烈&#xff0c;降噪技术也日益精进。回想过去&#xff0c;要想享受到优质的降噪体验&#xff0c;动辄需要花费数千元&#xff0c;但现在&#xff0c;高品质的降噪耳机已经降至百元级别。在众多降噪耳机中&#xff0c;头戴式耳机尤为…

网站SEO,该如何规范目标网站URL配置!

随着互联网技术的飞速发展&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;在网站建设和运营中的重要性日益凸显。优化目标网站的URL配置&#xff0c;作为SEO策略中的关键环节&#xff0c;对于提升网站在搜索引擎中的排名和曝光度具有至关重要的作用。大连蝙蝠侠科技将从U…

掌握IT资产发现的三个步骤

IT 资产生态系统非常复杂&#xff0c;因为资产不断变化&#xff0c;包括新增资产、移除过时资产或修改现有资产。在这种动态环境中&#xff0c;IT 资产管理者很难全面查看所有拥有的资产。 根据Gartner的预测&#xff0c;到 2025 年&#xff0c;大约 30% 的关键基础设施组织将…

Hutool树结构工具-TreeUtil构建树形结构

1 pom.xml <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.26</version> </dependency> 2 核心代码 import cn.beijing.satoken.domain.ZhiweiCityArea; import cn.beijing.sa…

机器人上的DPDK使用思考

引言 项目背景 人形机器人作为智能技术的集大成者&#xff0c;正逐步从科幻电影走进现实生活&#xff0c;广泛应用于工业制造、医疗健康、家庭服务等多个领域。在这一发展过程中&#xff0c;传感器技术的飞速发展和物联网技术的广泛应用&#xff0c;极大地提升了人形机器人对…

【AI视频】Runway:Gen-2 运镜详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI视频 | Runway 文章目录 &#x1f4af;前言&#x1f4af;Camera Control&#xff08;运镜&#xff09;&#x1f4af;Camera Control功能测试Horizonta&#xff08;左右平移&#xff09;Vertical&#xff08;上下平移&#xff0…

双token无感刷新

文章目录 &#x1f7e2;双token无感刷新1、token过期续期的五种方案对比2、双token的基本概念3、双token无感刷新的原理4、双token无感刷新的实现方式5.前端实现 ✒️总结 &#x1f7e2;双token无感刷新 对于token无感刷新这个东西有复杂度的话&#xff0c;它主要在后端&#x…

【使用Hey对vllm接口压测】模型并发能力

使用Hey对vllm进行模型并发压测 docker run --rm --networkknowledge_network \registry.cn-shanghai.aliyuncs.com/zhph-server/hey:latest \-n 200 -c 200 -m POST -H "Content-Type: application/json" \-H "Authorization: xxx" \-d {"model"…

如何查询论文的SCI检索号?

一、登录Web of Science 不要自己登录&#xff0c;需要选择机构为CHINA CERNET Federation&#xff0c;否则无法查询文章。 然后转到机构&#xff0c;选择对应的大学。 更具对应文章名查询文献。 二、查询文献名

CUDA并行架构

一、CUDA简介 CUDA(Compute Unified Device Architecture)是一种由NVIDIA推出的通用并行计算架构&#xff0c;该架构使GPU(Graphics Processing Unit)能够对复杂的计算问题做性能速度优化。 二、串并行模式 高性能计算的关键是利用多核处理器进行并行计算。 串行模式&#…

使用Anaconda安装pyTorch

1.Anaconda简介 Anaconda 是一个流行的 Python 数据科学和机器学习平台&#xff0c;它简化了包管理和部署&#xff0c;使得安装、运行和升级包及其依赖变得非常容易。Anaconda 通过其内置的 Conda 包和环境管理器&#xff0c;提供了一个强大的环境&#xff0c;用于科学计算&…

鸿蒙手势交互(四:多层手势)

四、多层手势 指父子组件嵌套时&#xff0c;父子组件均绑定了手势或事件。有两种&#xff0c;一种默认多层级手势事件&#xff0c;一种自定义多层级手势事件。 默认多层级手势事件&#xff1a;需要分清两个概念&#xff0c;触摸事件&#xff0c;手势与事件 触摸事件&#xf…

介绍个酷炫,适合装逼的命令

Hollywood - 给你的命令行加点魔法般的动画效果 作为命令行的重度用户,你是否想让枯燥的终端界面来点生动有趣的元素?Hollywood来了!这是一个无比诙谐、小巧玲珑而又功能强大的动画效果命令行工具。 Hollywood可以为文本添加各种动画效果,让你的输出显示得像电影般生动活泼。…

powerbi -L10-文件夹内的文件名

powerbi -L10-文件夹内的文件名 Folder.Contents letSource Folder.Contents("\\your_folder\ your_folder "),#"Removed Other Columns" Table.SelectColumns(Source,{"Name", "Date modified", "Folder Path"}), in#&q…