Loading...

DFS-岛屿数量

在这里插入图片描述

求解代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public int solve (char[][] grid) {
        int ans = 0;
        int m = grid.length,n =grid[0].length;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]=='1'){
                    ans++;
                    dfs(grid, i, j);
                }
            }
        }
        return ans;
    }

    private void dfs(char[][] grid,int i,int j){
        if(i<0||j<0||i>=grid.length||j>=grid[0].length){
            return;
        }


        if(grid[i][j]=='0'){
            return;
        }

        grid[i][j]='0';
        dfs(grid, i-1, j);
        dfs(grid, i+1, j);
        dfs(grid, i, j-1);
        dfs(grid, i, j+1);
    }

小贴士

1.这道题,发现一块陆地 grid[i][j]='1' 时,立刻把这块陆地,以及和它相连的所有陆地,全部修改为海水 '0',这样做可以实现用原数组本身做访问标记,这样就不需要额外创建 boolean[][] used 数组了。

2.解释一下代码里是 看到1就ans++,为什么不会把同一块相连的 1 重复计数?

其实,ans++ 并不是见到 1 就加,而是什么呢?

是这样的,发现了一个全新的、独立的岛屿的起点,这个时候岛屿数量就会 + 1,我们还要注意紧跟的 dfs(grid,i,j)

这个dfs会把岛屿的起点所属的一整块相连的所有 1,全部永久变成 0,这么做就能够实现一个岛屿,只会触发 1ans++

最后更新于 2026-04-05 17:35:33
Code Road Record