利用DFS解决力扣200题:Number of Islands岛屿数量

题目:

  给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。

示例1:

输入:

11110

11010

11000

00000

输出: 1

示例2:

输入:

11000

11000

00100

00011

输出:3

解释:每座岛屿只能由水平和/或竖直方向上相邻的陆地链接而成。

自己对题目的分析和理解:

该题求是所有岛屿的数量看似是求最小值,实际上仍然是当遍历到某一个岛屿时,求出包含它的最大区域,使得区域内全是相连的岛屿。求给的二维网格图中,连通分量的总数,那么就依次遍历二维数组中的每一个点,凡是值为1且未被访问过的点,都进行依次深度优先遍历,求出这个点对应的连通分量,然后将这个分量中的点都设置为已被访问,然后岛屿数量加一,继续进行遍历。直到所有的点都遍历完全,最后就可以求出总的岛屿数量。

总结:遍历网格中的所有点,如果值为1,则岛屿数量+1,进行深度优先搜索。

最后奉上DFS代码(参考):

 class Solution {
  public:
      int ans=0;
      int numIslands(vector<vector<char>>& grid) {
          if(grid.size()==0)
              return 0;
          for(int i=0;i<grid.size();i++){
              for(int j=0;j<grid[0].size();j++){
                 if(grid[i][j]=='1'){
                     dfs(grid,i,j);
                     ans++;
                 }
             }
         }
         return ans;
     }

     void dfs(vector<vector<char>>& grid,int i,int j){
         if(i<0||j<0||i>=grid.size()||j>=grid[0].size()||grid[i][j]!='1')    
             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);
         return ;
     }
  };

数媒202潘zy 

猜你喜欢

转载自blog.csdn.net/zjsru_Beginner/article/details/119988479