图论基础--孤岛系列

news/2024/11/8 23:09:11/

孤岛系列有:

孤岛总面积求解(用了dfs、bfs两种方法)和沉没孤岛(这里只写了dfs一种)

简单解释一下:

题目中孤岛的定义是与边缘没有任何接触的(也就是不和二维数组的最外圈连接),所以我们在这里求面积和沉没孤岛都是先把不是孤岛的剔除 ,然后剩下的就是孤岛,然后处理起来就简单多了,那么我们这里是怎么遍历不是孤岛的岛呢,很简单,与数组外圈的1相连的肯定就不是孤岛,所以我们直接从四个方向的边缘遍历将他们都处理掉。

其实都是dfs、bfs的模板题、基础题,都比较简单,这里贴出代码(太懒了,都写在了一个代码里...)

题目、题解链接:代码随想录

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class TheSquareOfIsolatedIsland {public static int ans=0;public static int[][] next={{1,0},{0,1},{-1,0},{0,-1}};//    dfs遍历计算孤岛面积public static void dfs(int[][] grid,int x,int y){grid[x][y]=0;ans++;for(int i=0;i<4;i++){int nextX=x+next[i][0];int nextY=y+next[i][1];if(nextX<0||nextX>=grid.length||nextY<0||nextY>=grid[0].length||grid[nextX][nextY]==0) continue;dfs(grid,nextX,nextY);}}//    bfs遍历计算孤岛面积public static void bfs(int[][] grid,int x,int y){Queue<int[]> queue=new LinkedList<>();queue.add(new int[] {x,y});grid[x][y]=0;ans++;while(!queue.isEmpty()){int[] theNext=queue.poll();int xx=theNext[0];int yy=theNext[1];for(int i=0;i<4;i++){int nextX=xx+next[i][0];int nextY=yy+next[i][1];if(nextX<0||nextX>=grid.length||nextY<0||nextY>=grid[0].length||grid[nextX][nextY]==0) continue;queue.add(new int[] {nextX,nextY});ans++;grid[nextX][nextY]=0;}}}//    沉没孤岛public static void dfs2(int[][] grid,int x,int y){grid[x][y]=-1;for(int i=0;i<4;i++){int nextX=x+next[i][0];int nextY=y+next[i][1];if(nextX<0||nextY<0||nextX>=grid.length||nextY>= grid[0].length) continue;if(grid[nextX][nextY]==0||grid[nextX][nextY]==-1) continue;dfs2(grid,nextX,nextY);}}public static void main(String[] args){Scanner scanner=new Scanner(System.in);int n=scanner.nextInt();int m=scanner.nextInt();int[][] grid=new int[n][m];for(int i=0;i<n;i++){for(int j=0;j<m;j++){grid[i][j]=scanner.nextInt();}}scanner.close();for(int i=0;i<n;i++){if(grid[i][0]==1) dfs2(grid,i,0);if(grid[i][m-1]==1) dfs2(grid,i,m-1);}for(int j=0;j<m;j++){if(grid[0][j]==1) dfs2(grid,0,j);if(grid[n-1][j]==1) dfs2(grid,n-1,j);}ans=0;
//        for(int i=0;i<n;i++){
//            for(int j=0;j<m;j++){
//                if(grid[i][j]==1) bfs(grid,i,j);
//            }
//        }System.out.println(ans);//        沉没孤岛输出操作for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(grid[i][j]==1) grid[i][j]=1;if(grid[i][j]==-1) grid[i][j]=0;}}for(int i=0;i<n;i++){for(int j=0;j<m;j++){System.out.print(grid[i][j]+" ");}System.out.println();}}
}


http://www.ppmy.cn/news/1545480.html

相关文章

大数据中的Kafka, Zookeeper,Flume,Nginx, Sqoop与ETL

以下是对 Kafka、Zookeeper、Flume、Nginx、Sqoop 和 ETL 的详细介绍,它们在大数据处理和分布式系统中有着重要的应用。 1. Kafka Apache Kafka 是一个开源的分布式消息队列系统,主要用于构建实时数据流处理系统。 1.1 核心特性 分布式架构:Kafka 的 Broker(消息代理)可…

鸿蒙中的FA模型和Stage模型

鸿蒙系统中的FA模型和Stage模型是两种不同的应用开发模型&#xff0c;它们在设计思想、组件类型、资源共享和内存占用、系统管理和控制能力&#xff0c;以及模型演进和主推程度等方面存在显著的差异。 FA模型 FA模型是“Feature Ability”&#xff08;功能能力&#xff09;的…

【spark面试】spark的shuffle过程

概述 所有的shuffle的过程本质上就是一个task将内存中的数据写入磁盘&#xff0c;然后另一个task将磁盘中的数据读入内存的过程。 对于mapreduce来说&#xff0c;我们将内存中的数据写入磁盘成为maptask&#xff0c;将磁盘中的数据读入内存称为reducetask。 而对于spark来说&…

Java项目实战II基于Spring Boot的个人云盘管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 基于Spring Boot的个人云盘管理系统设计…

小记-如何快速调整图片的分辨率

1.前言 在实际工作和开发中经常使用图片&#xff0c;有时候需要调整图片的质量&#xff0c;比如当图片大小很大不满足使用要求时&#xff0c;就需要降低图片质量&#xff0c;也就是压缩图片。 2.概念介绍 首先我们先明确一些概念&#xff0c;避免被网上形形色色的软件和所谓…

IPTABLE:Linux下的网络防火墙

IPTABLE&#xff1a;Linux下的网络防火墙 引言 在Linux系统中&#xff0c;IPtable是一种强大的网络防火墙工具&#xff0c;广泛应用于各种网络环境中。它不仅可以实现基本的包过滤功能&#xff0c;还能进行网络地址转换&#xff08;NAT&#xff09;、数据包记录、流量统计等高…

ETLCloud异常问题分析ai功能

在数据处理和集成的过程中&#xff0c;异常问题的发生往往会对业务运营造成显著影响。为了提高ETL&#xff08;提取、转换、加载&#xff09;流程的稳定性与效率&#xff0c;ETLCloud推出了智能异常问题分析AI功能。这一创新工具旨在实时监测数据流动中的潜在异常&#xff0c;自…

服务器作业(2)

架设一台NFS服务器&#xff0c;并按照以下要求配置 关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 配置文件设置&#xff1a; [rootlocalhost ~]# vim /etc/exports 1、开放/nfs/shared目录&#xff0c;供所有用户查询资料 共享…