图论基础--孤岛系列

孤岛系列有:

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

简单解释一下:

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

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

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

java 复制代码
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();
        }
    }
}
相关推荐
清梦20205 分钟前
经典问题---跳跃游戏II(贪心算法)
算法·游戏·贪心算法
Dream_Snowar27 分钟前
速通Python 第四节——函数
开发语言·python·算法
Altair澳汰尔40 分钟前
数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者
人工智能·算法·机器学习·数据分析·知识图谱
A懿轩A1 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
Python机器学习AI1 小时前
分类模型的预测概率解读:3D概率分布可视化的直观呈现
算法·机器学习·分类
吕小明么2 小时前
OpenAI o3 “震撼” 发布后回归技术本身的审视与进一步思考
人工智能·深度学习·算法·aigc·agi
1 9 J2 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法
程序员shen1616112 小时前
抖音短视频saas矩阵源码系统开发所需掌握的技术
java·前端·数据库·python·算法
汝即来归3 小时前
选择排序和冒泡排序;MySQL架构
数据结构·算法·排序算法
咒法师无翅鱼3 小时前
【定理证明工具调研】Coq, Isabelle and Lean.
算法