搜索(DFS)1岛屿的周长(easy)

Posted 念奕玥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜索(DFS)1岛屿的周长(easy)相关的知识,希望对你有一定的参考价值。

深度优先搜索DFS和广度优先搜索BFS是两种最常见的优先搜索方法,被广泛地运用在图和树等 结构中进行搜索。

深度优先搜索(depth-first seach,DFS)在搜索到一个新的节点时,立即对该新节点进行遍历;遍历需要用先入后出的栈来实现,也可以通过与栈等价的递归来实现。
对于树结构而言,由于总是对新节点调用遍历,因此看起来是向着“深”的方向前进。

深度优先搜索也可以用来检测环路:记录每个遍历过的节点的父节点,若一个节点被再次遍历且父节点不同,则说明有环。我们也可以用之后会讲到的拓扑排序判断是否有环路,若最后存在入度不为零的点,则说明有环。
有时我们可能会需要对已经搜索过的节点进行标记,以防止在遍历时重复搜索某个节点,这种做法叫做状态记录或记忆化(memoization)

leetcode 463 岛屿的周长


参考题解

// 基本的 DFS 框架:每次搜索四个相邻方格
void dfs(int[][] grid, int r, int c) 
    dfs(grid, r - 1, c); // 上边相邻
    dfs(grid, r + 1, c); // 下边相邻
    dfs(grid, r, c - 1); // 左边相邻
    dfs(grid, r, c + 1); // 右边相邻

对于网格边缘的方格,上下左右并不都有邻居。一种做法是在递归调用之前判断方格的位置,例如位于左边缘,则不访问其左邻居。但这样一个一个判断写起来比较麻烦,我们可以用**“先污染后治理”的方法,先做递归调用,再在每个 DFS 函数的开头判断坐标是否合法**,不合法的直接返回。同样地,我们还需要判断该方格是否有岛屿(值是否为 1),否则也需要返回。

class Solution 
    public int islandPerimeter(int[][] grid) 
        for(int r=0;r<grid.length;r++)
            for(int c=0;c<grid[0].length;c++)
                if(grid[r][c]==1)
                //因为题中规定只有一个岛屿
                    return dfs(grid,r,c);
                
            
        
        //没有岛屿就返回0
        return 0;

    
    public int dfs(int[][] grid, int r, int c)
        //陆地在网格边界
        if(r<0 || r>=grid.length || c<0 ||c>=grid[0].length)
            return 1;
        
        //与水域相邻则返回边长1
        if(grid[r][c]==0)
            return 1;
        
        //遍历过的就不再遍历
        if(grid[r][c]!=1)
            return 0;
        
        //此网格为陆地,且遍历过,赋值为2。
        grid[r][c]=2;
        //上下左右所有陆地的周长和。
        return dfs(grid,r-1,c)+dfs(grid,r,c-1)+ dfs(grid,r+1,c)+ dfs(grid,r,c+1);
    

以上是关于搜索(DFS)1岛屿的周长(easy)的主要内容,如果未能解决你的问题,请参考以下文章

搜索(DFS)1岛屿的周长(easy)

岛屿类问题的通用解法DFS 遍历框架

岛屿类问题的通用解法DFS 遍历框架

岛屿问题--DFS问题

搜索2岛屿的数量(medium)

搜索2岛屿的数量(medium)