首页 > 其他分享 >图论-岛屿数量问题

图论-岛屿数量问题

时间:2025-01-20 22:03:53浏览次数:3  
标签:图论 int graph 岛屿 util ++ new visited 数量

代码随想录笔记-图论岛屿问题

内容:

题目描述:

LeetCode 200. 岛屿数量 - 力扣(LeetCode)

(图源自代码随想录官网)

本题是经典的图论遍历问题 , 只要能完成遍历即可 , 核心在于 只要发现一块地,那么标记一下已经走过即可 , 以上图例输出为 3  

- DFS深度优先搜索方法:

每次是碰到水就回溯 , 直到整块陆地被填满visited

import javafx.util.Pair;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

/**
 * @author hasno
 */
public class Main {
    //四个方向 , 对应着每次延伸的方向
    static int[][] dir = {
  
  {1,0},{0,1},{-1,0},{0,-1}};
    public static void dfs(int[][] graph , int[][] visited , int x , int y) {
        if(graph[x][y] == 0 || visited[x][y] == 1) {
            return;
        }
        for(int i = 0 ; i < 4 ; i++) {
            visited[x][y] = 1;
            int nextx = x + dir[i][0];
            int nexty = y + dir[i][1];
            //这里注意 y是 graph[0].length 的边界.
            if(nexty < 0 || nextx < 0 || nextx >= graph.length || nexty >= graph[0].length) {
                continue;
            }
            dfs(graph,visited,nextx,nexty);
        }
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //行数
        int n = scanner.nextInt();
        //列数
        int m = scanner.nextInt();

        int[][] graph = new int[n][m];

        for (int i = 0 ; i < n ; i++) {
            for(int j = 0 ; j < m ; j++) {
                graph[i][j] = scanner.nextInt();
            }
        }
        int[][] visited = new int[n][m];
        int result = 0;

        for (int i = 0 ; i < n ; i++) {
            for(int j = 0 ; j < m ; j++) {
                if(visited[i][j] == 0 && graph[i][j] == 1) {
                    //只要是满足没有被visited 并且是陆地 那么result++
                    result++;
                    dfs(graph,visited,i,j);
                }
            }
        }
        System.out.println(result);


    }
}

- BFS广度优先搜索:

按照一个圆圈来一圈圈的扩展 visited

import javafx.util.Pair;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

/**
 * @author hasno
 */
public class Main {
    static int[][] dir = {
  
  {1,0},{0,1},{-1,0},{0,-1}};
    public static void bfs(int[][] graph , int[][] visited , int x , int y) {
        Queue<Pair<Integer,Integer>> que = new LinkedList<>();
        que.add(new Pair<>(x,y));
        visited[x][y] = 1;
        while (!que.isEmpty()) {
            Pair<Integer, Integer> cur = que.peek();
            que.poll();
            int curx = cur.getKey();
            int cury = cur.getValue();
            for (int i = 0 ; i < 4 ; i++) {
                int nextX = curx+dir[i][0];
                int nextY = cury+dir[i][1];
                if(nextY >= graph[0].length || nextX >= graph.length || nextX < 0 || nextY < 0) {
                    continue;
                }
                if(graph[nextX][nextY] == 1 && visited[nextX][nextY] == 0) {
                    que.add(new Pair<>(nextX,nextY));
                    visited[nextX][nextY] = 1;
                }
            }
        }

    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //行数
        int n = scanner.nextInt();
        //列数
        int m = scanner.nextInt();

        int[][] graph = new int[n][m];

        for (int i = 0 ; i < n ; i++) {
            for(int j = 0 ; j < m ; j++) {
                graph[i][j] = scanner.nextInt();
            }
        }
        int[][] visited = new int[n][m];
        int result = 0;

        for (int i = 0 ; i < n ; i++) {
            for(int j = 0 ; j < m ; j++) {
                if(visited[i][j] == 0 && graph[i][j] == 1) {
                    result++;
                    bfs(graph,visited,i,j);
                }
            }
        }
        System.out.println(result);

    }
}

总结:

相同点:深度优先和广度优先 ,二者其实本质上都是为了走遍图的每一个角落,以此来找到需要解决的问题。 

不同点:广度优先能够更好的找到最短路径。 深度优先能解决回溯问题。

(小tips: JavaFX在最新版本并没法使用,在1.8可以正常使用 , 因此Pair<> 之后就没法使用了。还是有点悲伤的,目前在Java原生包里没有替代品,但是Apache Commons Lang库里面提供了替代品.)

标签:图论,int,graph,岛屿,util,++,new,visited,数量
From: https://blog.csdn.net/2301_79841192/article/details/145269920

相关文章

  • Pod数量的扩缩容
    在K8s中,Pod的扩容和自动扩容是帮助实现弹性伸缩和高可用性的关键功能。1.水平扩容(HorizontalScaling)水平扩容通过增加多个相同配置的Pod来应对增加的流量或负载。与垂直扩容不同,水平扩容是通过在集群中分布更多相同的资源来实现的。手动水平扩容:通过命令kubectl......
  • 图论/连通性
    点边连通度:耳分解:强连通有向图/边双联通无向图从一个点出发,每次加入从集合出发回到集合,中间点不在集合内的环,一定能生成该图。边双强连通双极定向:link割空间与环空间互为正交补。切边等价:模板qoj1351CF1648F树分解:也就是找到一种划分方式,使得每种划分内点......
  • MarsCode青训营打卡Day5(2025年1月18日)|稀土掘金-148.小A的子数组权值、304.计算特定条
    资源引用:148.小A的子数组权值304.计算特定条件下的四元组数量今日小记:148.题既可以如笔者给出的题解来遍历全部的子数组,也可以按照遍历权值的方式通过滑动窗口来实现,两种解题方法的时间复杂度相同,但前者的操作更为简单。304.题与Day4的三元组一题有相似之处,均通过将多元......
  • 2010-2022年地级市新增国家级、省级新区数量和总量
    2010-2022年中国地级市当年新增国家级、省级新区数量和总量STATA数据dta格式共计2781个新区,包含国家级和省级的开发区,指由国务院和省、自治区、直辖市人民政府批准在城市规划辖区内设立的开发区,具有国家或省级实行的特定的优惠政策,包含经济技术开发区、保税区、高新技术产业......
  • 工单主替料自动分配数量
    *&---------------------------------------------------------------------**&ReportZPPR0045*&---------------------------------------------------------------------**&*&-----------------------------------------------------------------......
  • 【LeetCode】力扣刷题热题100道(31-35题)附源码 搜索二维矩阵 岛屿数量 腐烂的橙子 课程
    一、搜索二维矩阵编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。可以使用从右上角开始搜索的方法来有效地找到目标值。选择起始位置:从矩阵的右上角开始。......
  • 图论中存在哪些不同的路径?
    在初次接触图论时,许多学习者会感到困惑:为什么有些问题要求路径不能重复经过任何节点或边,而有些问题却允许重复?不同的路径定义如何影响问题的求解?这些问题反映了图论中路径的多样性和复杂性,也为研究者提供了丰富的探索空间。路径的分类及定义在图中,根据路径是否允许重复经过节点......
  • 905 路径数量统计
    //905路径数量统计.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/22/problem/1044给你一张有向图,图中可能存在重边和自环,请求出从点u出发经过恰好k条边后到达点v的通路的条数。由于答案可能很大,请输出答案模109+7......
  • LeetCode 1773. 统计匹配检索规则的物品数量
    在这个问题中,我们被要求统计一个物品数组中满足特定检索规则的物品数量。每个物品由其类型、颜色和名称定义,而检索规则由规则键和规则值指定。我们的任务是找出数组中满足这些规则的物品数量。问题描述解题思路定义索引映射:首先,我们需要定义一个映射,将规则键("type"、"color......
  • LeetCode题练习与总结:省份数量--547
    一、题目描述有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个 nxn 的矩阵 isConnected ,其......