[LeetCode][C++]岛屿数量

岛屿数量

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:
输入:
[
[‘1’,‘1’,‘1’,‘1’,‘0’],
[‘1’,‘1’,‘0’,‘1’,‘0’],
[‘1’,‘1’,‘0’,‘0’,‘0’],
[‘0’,‘0’,‘0’,‘0’,‘0’]
]
输出: 1

示例 2:
输入:
[
[‘1’,‘1’,‘0’,‘0’,‘0’],
[‘1’,‘1’,‘0’,‘0’,‘0’],
[‘0’,‘0’,‘1’,‘0’,‘0’],
[‘0’,‘0’,‘0’,‘1’,‘1’]
]
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。


思路:

  1. 采用广度优先遍历。
  2. 遍历地图:对于一个陆地,将其压入队列中,找出其四个方向上所有连接的陆地,若陆地没有访问过,则将其压入到队列中,直到队列为空,则找出了一个岛屿。计数器加1.
  3. 找下一个岛屿。

代码:

class Solution {
public:
    
    struct point{
        int i;      //行
        int j;      //列
        point(int x, int y):i(x),j(y){}  //注意这个初始化方法,称为初始化列表
    };
    
    int numIslands(vector<vector<char>>& grid) {
        int numIslands=0,row,col;
        row=grid.size();    
        if(row==0)
            return 0;
        col=grid[0].size();
        
        for(int r=0;r<row;r++)
        {
            for(int c=0;c<col;c++)
            {
                if(grid[r][c]=='1')
                {
                    point p(r,c);    //岛屿起点
                    queue<point> q;
                    q.push(p);
                    while(!q.empty())
                    {
                        point tmp_p=q.front();
                        q.pop();
                        if(grid[tmp_p.i][tmp_p.j]=='1')
                        {
                            grid[tmp_p.i][tmp_p.j]='2';   //标记已访问                
                            //上下左右
                            if(tmp_p.i>0 && grid[tmp_p.i-1][tmp_p.j]=='1')
                                q.push(point(tmp_p.i-1,tmp_p.j));
                            if(tmp_p.i<row-1 && grid[tmp_p.i+1][tmp_p.j]=='1')
                                q.push(point(tmp_p.i+1,tmp_p.j));
                            if(tmp_p.j>0 && grid[tmp_p.i][tmp_p.j-1]=='1')
                                q.push(point(tmp_p.i,tmp_p.j-1));
                            if(tmp_p.j< col-1 && grid[tmp_p.i][tmp_p.j+1]=='1')
                                q.push(point(tmp_p.i,tmp_p.j+1));                            
                        }                                                                                       
                    }
                    numIslands++;                    
                }                
            }
        }                            
        return numIslands;
    }        
};

结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值