深度优先搜索模板

深度优先搜索模板

典型例题与程序示例

典型例题如695. 岛屿的最大面积
示例代码如下

private int m, n;
private int[][] direction = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};

public int maxAreaOfIsland(int[][] grid) {
    if (grid == null || grid.length == 0) {
        return 0;
    }
    m = grid.length;
    n = grid[0].length;
    int maxArea = 0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            maxArea = Math.max(maxArea, dfs(grid, i, j));
        }
    }
    return maxArea;
}

private int dfs(int[][] grid, int r, int c) {
    if (r < 0 || r >= m || c < 0 || c >= n || grid[r][c] == 0) {//判断合法性
        return 0;
    }
    grid[r][c] = 0;//标记已访问
    int area = 1;
    for (int[] d : direction) {//领域搜索与业务计算
        area += dfs(grid, r + d[0], c + d[1]);
    }
    return area;
}

总结

其实很多dfs的题目在dfs搜索部分可以使用相同的套路解决,所以在此简单总结记录一下
1、首先上来先来一个if判断下合法性,把不符合条件的情况过滤掉,此处合法性判断一般都要判断是否已访问,其实就是过滤掉邻域中不合法和已访问过的元素
2、接下来标记当前元素已访问
3、领域搜索进行递归,同时进行业务计算

原文地址:https://www.cnblogs.com/wunsiang/p/12717839.html