岛屿数量(力扣)

题目:岛屿数量

题目链接

题目描述:

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

示例:

在这里插入图片描述

题解:

该题和扫雷问题是相似的,甚至比扫雷问题简单,但都是用到了深度优先搜索。遍历岛屿二维向量,发现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%的用户

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值