算法day44-图论(2)

目录

  1. 岛屿数量 深搜
  2. 岛屿数量 广搜
  3. 岛屿的最大面积

一、岛屿数量 深搜

 99. 岛屿数量

 

import java.util.*;

public class Main{
    static int[] dx = {0,0,1,-1};
    static int[] dy = {1,-1,0,0};
    public static void main(String[] args){
        //用DFS
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int[][] grid = new int[n][m];
        int res = 0;
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                grid[i][j] = in.nextInt();
            }
        }
        boolean[][] visited = new boolean[n][m];
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                //这个点没被访问过且该点为1
                if(!visited[i][j] && grid[i][j] == 1){
                    res++;
                    visited[i][j] = true;
                    dfs(visited,i,j,grid);
                }
            }
        }
        System.out.println(res);
    }
    public static void dfs(boolean[][] visited, int x ,int y, int[][] grid){
        for(int i=0; i<4; i++){
            int nx = x + dx[i];
            int ny = y + dy[i];
            if(nx >= 0 && nx < grid.length && ny >=0 && ny < grid[0].length
                && !visited[nx][ny] && grid[nx][ny] == 1){
                    visited[nx][ny] = true;
                    dfs(visited, nx, ny, grid);
                }
        }
    }
}

 

二、 岛屿数量 广搜

 

import java.util.*;

public class Main{
    static boolean[][] visited;
    static int[] dx = {0,0,1,-1};
    static int[] dy = {1,-1,0,0};
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        visited = new boolean[n][m];
        int[][] grid = new int[n][m];
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                grid[i][j] = in.nextInt();
            }
        }
        int res = 0;
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                if(!visited[i][j] && grid[i][j] == 1){
                    res++;
                    bfs(grid, visited, i , j);
                }
            }
        }
        System.out.println(res);
    }
    public static void bfs(int[][] grid, boolean[][] visited, int x, int y){
        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[]{x,y});
        visited[x][y] = true;
        while(!queue.isEmpty()){
            int[] cur = queue.poll();
            int curX = cur[0];
            int curY = cur[1];
            for(int i=0; i<4; i++){
                int nx = curX + dx[i];
                int ny = curY + dy[i];
                if(nx >= 0 && nx < grid.length && ny >=0 && ny < grid[0].length
                     && !visited[nx][ny] && grid[nx][ny] == 1){
                        queue.add(new int[]{nx,ny});
                        visited[nx][ny] = true;
                     }
            }
        }
    }
}

三、岛屿的最大面积

 100. 岛屿的最大面积

 

import java.util.*;

class Main{
    static int[] dx = {0,0,1,-1};
    static int[] dy = {1,-1,0,0};
    static int area;
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int[][] grid = new int[n][m];
        boolean[][] visited = new boolean[n][m];
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                grid[i][j] = in.nextInt();
            }
        }
        int maxArea = 0;
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                if(!visited[i][j] && grid[i][j] == 1){
                    area = 0;
                    bfs(grid, visited, i, j);
                    maxArea = Math.max(maxArea, area);
                }
            }
        }
        System.out.println(maxArea);
    }
    public static void bfs(int[][] grid, boolean[][] visited, int x, int y){
        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[]{x,y});
        visited[x][y] = true;
        area++;

        while(!queue.isEmpty()){
            int[] cur = queue.poll();
            int curX = cur[0];
            int curY = cur[1];
            for(int i=0; i<4; i++){
                int nx = curX + dx[i];
                int ny = curY + dy[i];
                if(nx >= 0 && nx < grid.length && ny >= 0 && ny < grid[0].length
                    && !visited[nx][ny] && grid[nx][ny] == 1){
                        queue.add(new int[]{nx,ny});
                        visited[nx][ny] = true;
                        area++;
                    }
            }
        }
    }
}

 

posted @ 2025-06-19 18:13  筱倩  阅读(240)  评论(0)    收藏  举报