岛屿数量(力扣)

题目:岛屿数量

题目链接

题目描述:

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

示例:

岛屿数量(力扣)_第1张图片

题解:

该题和扫雷问题是相似的,甚至比扫雷问题简单,但都是用到了深度优先搜索。遍历岛屿二维向量,发现1时,深搜,把1的上下左右仍是1的置0,并继续深搜,直至二维向量全为0.深搜的次数即为所求。

代码:

class Solution {
public:
    void dfs(vector<vector<char>>& grid,int m,int n)
    {
        int i,j;
        int sum=0;
        if(grid[m][n]=='1')
        {   
            grid[m][n]='0';
            for(i=m-1;i<=m+1;i++)
            {
                for(j=n-1;j<=n+1;j++)
                {
                    sum++;
                    if(i<0||i>=grid.size()||j<0||j>=grid[0].size()||sum%2==1)//越界
                    {
                        continue;
                    }
                    else
                    {
                        dfs(grid,i,j);//递归展开
                    }
                }
            }
        }
    }
    int numIslands(vector<vector<char>>& grid) {
       int sum=0;
       int i,j;
       int x=0,y=0;
       for(i=0;i<grid.size();i++)
       {
           for(j=0;j<grid[0].size();j++)
           {
               if(grid[i][j]=='1')
               {
                   dfs(grid,i,j);
                   sum++;
               }
           }
       }
       return sum;
    }
};

执行用时 :16 ms, 在所有 C++ 提交中击败了57.63%的用户
内存消耗 :8.6 MB, 在所有 C++ 提交中击败了100.00%的用户

你可能感兴趣的:(刷题)