day50 图论章节刷题Part02(99.岛屿数量 深搜、99.岛屿数量 广搜、100.岛屿的最大面积)

前言:前段时间论文开题落下了很多进度,今天开始会尽快赶上

99.岛屿数量 深搜

思路:对地图进行遍历遇到一个没有遍历过的陆地节点,计数器就+1,并把该节点所能遍历到的陆地都标记上;遇到标记过的陆地节点和海洋节点的时候直接跳过。

代码如下:

复制代码
import java.util.Scanner;
public class Main{
    //定义前进的方向
    public static int[][] dir={{0,1},{1,0},{-1,0},{0,-1}};
    //深度搜索函数
    public static void dfs(boolean[][] visited,int[][] grid,int x,int y){
        for(int i=0;i<4;i++){
            int nextX=x+dir[i][0];
            int nextY=y+dir[i][1];
            if(nextX<0 || nextY<0 || nextX>=grid.length || nextY>=grid[0].length) continue;
            if(!visited[nextX][nextY] && grid[nextX][nextY]==1){
                visited[nextX][nextY]=true;
                dfs(visited,grid,nextX,nextY);
            }
        }
    }
    
    public static void main (String[] args) {
      	//构建地图
        Scanner scan = new Scanner(System.in);
        int n=scan.nextInt();
        int m=scan.nextInt();
        int[][] grid=new int[n][m];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                grid[i][j]=scan.nextInt();
            }
        }
        //判断是否为岛屿
        int result=0;
        boolean[][] visited=new boolean[n][m];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(!visited[i][j] && grid[i][j]==1){
                    result++;
                    visited[i][j]=true;
                    dfs(visited,grid,i,j);
                }
            }
        }
        System.out.println(result);
    }
}

99.岛屿数量 广搜

注意:要在节点加入队列时就标记走过,如果从队列拿出来的时候再标记走过就会导致很多节点重复加入队列。

广度搜索使用队列存放下一层搜索的节点,与DFS的区别是不需要调用自身,把队列中的元素遍历完即可。

代码如下:

复制代码
import java.util.*;
class Pair{
    int x;
    int y;

    public Pair(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

public class Main{
    //定义前进的方向
    public static int[][] dir={{0,1},{1,0},{-1,0},{0,-1}};
    public static void bfs(boolean[][] visited,int[][] grid,int x,int y){
        Queue<Pair> queue=new LinkedList<>();
        queue.add(new Pair(x,y));
        visited[x][y]=true;
        while(!queue.isEmpty()){
            Pair cur=queue.poll();
            int curX=cur.x;
            int curY=cur.y;
            for(int i=0;i<4;i++){
                int nextX=curX+dir[i][0];
                int nextY=curY+dir[i][1];
                if(nextX<0 || nextY<0 || nextX>=grid.length || nextY>=grid[0].length) continue;
                if(!visited[nextX][nextY] && grid[nextX][nextY]==1){
                    queue.add(new Pair(nextX,nextY));
                    visited[nextX][nextY]=true;
                }
            }
        }
    }
    
    public static void main (String[] args) {
        Scanner scan = new Scanner(System.in);
        int n=scan.nextInt();
        int m=scan.nextInt();
        int[][] grid=new int[n][m];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                grid[i][j]=scan.nextInt();
            }
        }
        int result=0;
        boolean[][] visited=new boolean[n][m];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(!visited[i][j] && grid[i][j]==1){
                    result++;
                    bfs(visited,grid,i,j);
                }
            }
        }
        System.out.println(result);
    }
}

100.岛屿的最大面积

思路:只需要在标记一个陆地节点周边所有陆地节点时对这个岛屿的面积计数即可,最后比较获得最大的面积。使用全局静态变量count来计数。

dfs只处理下一个节点,即在主函数遇到岛屿就计数为1,dfs处理接下来的相邻陆地.

代码如下:

复制代码
import java.util.Scanner;
public class Main{
    //定义前进的方向
    public static int[][] dir={{0,1},{1,0},{-1,0},{0,-1}};
    public static int count;
    //深度搜索函数
    public static void dfs(boolean[][] visited,int[][] grid,int x,int y){
        for(int i=0;i<4;i++){
            int nextX=x+dir[i][0];
            int nextY=y+dir[i][1];
            if(nextX<0 || nextY<0 || nextX>=grid.length || nextY>=grid[0].length) continue;
            if(!visited[nextX][nextY] && grid[nextX][nextY]==1){
                visited[nextX][nextY]=true;
                count++;
                dfs(visited,grid,nextX,nextY);
            }
        }
    }
    
    public static void main (String[] args) {
      	//构建地图
        Scanner scan = new Scanner(System.in);
        int n=scan.nextInt();
        int m=scan.nextInt();
        int[][] grid=new int[n][m];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                grid[i][j]=scan.nextInt();
            }
        }
        //判断是否为岛屿
        boolean[][] visited=new boolean[n][m];
        int result=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(!visited[i][j] && grid[i][j]==1){
                    count=1;
                    visited[i][j]=true;
                    dfs(visited,grid,i,j);
                }
                if(count>result) result=count;
            }
        }
        System.out.println(result);
    }
}
相关推荐
依然鸣18 小时前
PTA团体程序设计天梯赛L2真题讲解L2-005-008
开发语言·数据结构·c++·算法·深度优先·pat考试·图论
wabs6661 天前
关于图论【最短路径之Bellman_ford 算法(单源有限最短路)|卡码网96.城市间货物运输III的思考】
数据结构·算法·图论·卡码网·bellman_ford·单源有限最短路
wabs6663 天前
关于图论【最短路径之Bellman_ford 算法(判断负权回路)|卡码网95.城市间货物运输II的思考】
数据结构·算法·图论·bellman_ford算法·卡码网·判断负权回路
cpp_25014 天前
P1113 [USACO02FEB] 杂务
数据结构·c++·算法·动态规划·图论·拓扑排序·洛谷题解
漂流瓶jz4 天前
UVA-12174 Shuffle的播放记录 题解答案代码 算法竞赛入门经典第二版
数据结构·c++·算法·图论·滑动窗口·算法竞赛入门经典·uva
wabs6665 天前
关于图论【最短路径之Bellman_ford 算法|卡码网94.城市间货物运输的思考】
数据结构·算法·图论·卡码网·bellman_ford·求最短路径
wabs6665 天前
关于图论【最短路径之Dijkstra算法(堆优化版)|卡码网47.参加科学大会的思考】
数据结构·算法·图论·优先级队列·邻接表·小顶堆·卡码网
wabs6666 天前
关于哈希表【力扣1.两数之和的思考】
数据结构·算法·leetcode·散列表·图论
oier_Asad.Chen7 天前
【洛谷题解/AcWing题解/真题】洛谷P2330【SCOI2005】繁忙的都市(Kruskal算法的再探究))
c++·算法·贪心算法·图论·最小生成树·kruskal
wabs6667 天前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网