99. 计数孤岛

题目描述

给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。

输入描述

第一行包含两个整数 N, M,表示矩阵的行数和列数。

后续 N 行,每行包含 M 个数字,数字为 1 或者 0。

输出描述

输出一个整数,表示岛屿的数量。如果不存在岛屿,则输出 0。

输入示例

4 5
1 1 0 0 0
1 1 0 0 0
0 0 1 0 0
0 0 0 1 1

输出示例

3

提示信息

img

根据测试案例中所展示,岛屿数量共有 3 个,所以输出 3。

数据范围:

1 <= N, M <= 50

解题思路

深搜版

import java.util.*;
class Main {
    public static final int[][] dir = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
    public static void dfs(int[][] martix, boolean[][] visited, 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 >= martix.length || nextY >= martix[0].length) {
                continue;
            }

            if (!visited[nextX][nextY] && martix[nextX][nextY] == 1) {
                visited[nextX][nextY] = true;
                dfs(martix, visited, nextX, nextY);
            }
        }
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), m = in.nextInt();
        int[][] martix = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                martix[i][j] = in.nextInt();
            }
        }
        in.close();

        boolean[][] visited = new boolean[n][m];
        int ans = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (!visited[i][j] && martix[i][j] == 1) {
                    ans++;
                    dfs(martix, visited, i, j);
                }
            }
        }
        System.out.println(ans);
    }
}

广搜版

public static void bfs(int[][] martix, 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 nextX = curX + dir[i][0];
                int nextY = curY + dir[i][1];

                if (nextX < 0 || nextX >= martix.length || nextY < 0 || nextY >= martix[0].length) {
                    continue;
                }
                if (!visited[nextX][nextY] && martix[nextX][nextY] == 1) {
                    queue.add(new int[]{nextX, nextY});
                    visited[nextX][nextY] = true;
                }
            }
        }
    }

100.最大岛屿的面积

题目描述

给定一个由 1(陆地)和 0(水)组成的矩阵,计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。

输入描述

第一行包含两个整数 N, M,表示矩阵的行数和列数。后续 N 行,每行包含 M 个数字,数字为 1 或者 0,表示岛屿的单元格。

输出描述

输出一个整数,表示岛屿的最大面积。如果不存在岛屿,则输出 0。

输入示例

4 5
1 1 0 0 0
1 1 0 0 0
0 0 1 0 0
0 0 0 1 1

输出示例

4

提示信息

img

样例输入中,岛屿的最大面积为 4。

数据范围:

1 <= M, N <= 50。

解题思路

import java.util.*;
class Main {
    public static int[][] dir = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};

    public static int area = 0;
    public static void dfs(int[][] martix, boolean[][] visited, int x, int y) {
        area++;
        visited[x][y] = true;

        for (int i = 0; i < 4; i++) {
            int nextX = x + dir[i][0];
            int nextY = y + dir[i][1];
            if (nextX < 0 || nextX >= martix.length
            || nextY < 0 || nextY >= martix[0].length) {
                continue;
            }
            if (!visited[nextX][nextY] && martix[nextX][nextY] == 1) {
                dfs(martix, visited, nextX, nextY);
            }
            
        }
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), m = in.nextInt();
        int[][] martix = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                martix[i][j] = in.nextInt();
            }
        }
        in.close();

        int ans = 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] && martix[i][j] == 1) {
                    area = 0;
                    dfs(martix, visited, i, j);
                    ans = Math.max(area, ans);
                }
            }
        }
        System.out.println(ans);
    }
}