网格DFS

90 阅读1分钟

网格如何DFS

  • 结合二叉树的DFS可以类比推出
//树dfs
void dfs(TreeNode root){
    if(root!=null)
    //处理当前节点
    ....
    
    dfs(root.left);
    dfs(root.right);
}
//网格dfs
void dfs(char[][] grid,int i,int j){
        if(i<0 || i>=grid.length || j<0 || j>=grid[0].length || grid[i][j]!='1') return;
        //以免重复搜索
        grid[i][j]='2';
        dfs(grid,i-1,j);
        dfs(grid,i,j-1);
        dfs(grid,i,j+1);
        dfs(grid,i+1,j);
    }

200. 岛屿数量

  • 借助对网格的每个节点dfs即可得出岛屿的数量有多少个,因为每次深度搜索(四个方向延伸)到陆地之后置为2,即一个一个节点深度搜索可以得出所有岛屿总数,
class Solution {
    public int numIslands(char[][] grid) {
        int ans=0;
        for(int i=0;i<grid.length;i++){
            for(int j=0;j<grid[0].length;j++){
                if(grid[i][j]=='1') {
                    dfs(grid,i,j);
                    ans++;
                }
                
            }
        }
        return ans;
    }
    void dfs(char[][] grid,int i,int j){
        if(i<0 || i>=grid.length || j<0 || j>=grid[0].length || grid[i][j]!='1') return;
        grid[i][j]='2';
        dfs(grid,i-1,j);
        dfs(grid,i,j-1);
        dfs(grid,i,j+1);
        dfs(grid,i+1,j);
    }
}

answer:leetcode-cn.com/problems/nu…

463. 岛屿的周长

  • 此题是很好被用来分析网格DFS的
  • 当搜索到边界时,岛长要+1
  • 当搜索到海洋时,岛长也要+1

image.png

class Solution {
    public int islandPerimeter(int[][] grid) {
        for(int i=0;i<grid.length;i++){
            for(int j=0;j<grid[0].length;j++){
                if(grid[i][j]==1) {
                    return dfs(grid,i,j);
                }
                
            }
        }
        return 0;
    }
    int dfs(int[][] grid,int i,int j){
        //到边界了,+1
        if(i<0 || i>=grid.length || j<0 || j>=grid[0].length) return 1;
        //到海洋了,+1
        if(grid[i][j]==0) return 1;
        if(grid[i][j]!=1) return 0;
        grid[i][j]=2;
        return dfs(grid,i-1,j)+dfs(grid,i,j-1)+dfs(grid,i,j+1)+dfs(grid,i+1,j);
    }
}

695. 岛屿的最大面积

827. 最大人工岛