DFS不怂之《leetcode-岛屿的个数》

leetcode刷到这道题:

给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

示例 1:

输入:
11110
11010
11000
00000

输出: 1

示例 2:

输入:
11000
11000
00100
00011

输出: 3


开始一直没思路,后来看别人的思路,发现就是求连通集的数目。然后发现已经把DFS、BFS怎么写忘光了。
其实是想说,老师有教怎么写,我只是把老师的教法忘光了,看了一下以前的代码,拢了拢思路,决定管它的BFS、DFS、Prime、Dijsktra...自己写好了
于是就根据DFS的思路开始解这道题,从任意一个点开始搜,如果相邻的点为1且没有被访问过,就用递归接着这个点搜,一直搜到相邻点不为1或者已经被访问过为止
第一轮搜索完了,看剩下的点有没有值为1且没有被访问过,有的话用第一轮的思路接着搜。就搜完了。
代码如下:
class Solution {
public:
    void DFS(vector< vector<char> >& grid, vector< vector<int> >& visited, int i, int j){
        if(i>0 && grid[i-1][j] == '1' && visited[i-1][j] == 0){
            visited[i-1][j] = 1;
            DFS(grid, visited, i-1, j);
        }
        if(j>0 && grid[i][j-1] == '1' && visited[i][j-1] == 0){
            visited[i][j-1] = 1;
            DFS(grid, visited, i, j-1);
        }
        int n1 = grid.size();int n2 = grid[0].size();
        if(i<n1-1 && grid[i+1][j] == '1' && visited[i+1][j] == 0){
            visited[i+1][j] = 1;
            DFS(grid, visited, i+1, j);
        }
        if(j<n2-1 && grid[i][j+1] == '1' && visited[i][j+1] == 0){
            visited[i][j+1] = 1;
            DFS(grid, visited, i, j+1);
        }
    }
    int numIslands(vector< vector<char> >& grid) {
        int n1 = grid.size();
        if(n1==0) return 0;
        int n2 = grid[0].size();
        if(n2 == 0) return 0;
        vector< vector<int> > visited(n1,vector<int>(n2,0)); 
        int num = 0;
        for(int i = 0;i<n1;i++){
            for(int j = 0;j<n2;j++){
                if(grid[i][j] == '1' && not visited[i][j]){
                    num++;
                    DFS(grid, visited, i, j);
                }
            }
        }
        return num;
    }
};

猜你喜欢

转载自www.cnblogs.com/fanmu/p/9492864.html