【力扣】岛屿数量

题目链接

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

输入:二维网格地图,例如[[1,1,1,'1','0'],
					 ['1','1','0','1','0'],
					 ['1','1','0','0','0'],
					 ['0','0','0','0','0']]
输出:岛屿数量,如上面地图的岛屿数量为 1
  1. c++实现:
class Solution {
public:
    //判断点是否在地图内
    bool is_inmap(vector<vector<char>>& grid,pair<int,int>& pp)
    { 
        if((pp.first>=0)&&(pp.first<grid.size())&&(pp.second>=0)&&(pp.second<grid[0].size()))
            return true;
        else return false;
    }
    //
     
   	   int numIslands(vector<vector<char>>& grid) {
       //地图为空时将返回0;
           if(grid.empty())return 0;
           queue<pair<int,int>> qg;
        //保存地图坐标(x,y)的数据结构
        int ans=0;
        //地图的y轴大小
        int m=grid.size();
        //地图的x轴大小
        int n=grid[0].size();
        for(int i_y=0;i_y<m;i_y++)
            for(int i_x=0;i_x<n;i_x++)
            {
                //寻找地图上第一个为‘1’的点作为DFS的根
                if(grid[i_y][i_x]=='1')
                {
                    qg.push(pair(i_y,i_x));
                    //BFS
                    //qg非空时将进行DFS
                    while(!qg.empty())
                    {
                        pair<int,int> ppo=qg.front();
                        qg.pop();
                        //遇到队列qg中被置为‘0’的点则继续查找下一个点
                        if(grid[ppo.first][ppo.second]=='0')continue;
                        grid[ppo.first][ppo.second]='0';
                        pair<int,int> up=pair(ppo.first-1,ppo.second);
                        pair<int,int> down=pair(ppo.first+1,ppo.second);
                        pair<int,int> left=pair(ppo.first,ppo.second-1);
                        pair<int,int> right=pair(ppo.first,ppo.second+1);
                        if(is_inmap(grid,up)&&(grid[up.first][up.second]=='1'))qg.push(up);    
                        if(is_inmap(grid,down)&&(grid[down.first][down.second]=='1'))qg.push(down);                                                      												                      
                        if(is_inmap(grid,left)&&(grid[left.first][left.second]=='1'))qg.push(left);                       
                        if(is_inmap(grid,right)&&(grid[right.first][right.second]=='1'))qg.push(right);                      
                    }
                    //BFS完成岛屿计数加一
                    ans++;
                }
            }
        return ans;
    }
};
  1. 题目分析:
    可通过深度搜索或广度搜索:遍历地图上的点找到第一个‘1’以其为根查其他的’1’,并将其坐标{x,y}压入stack>
    (深度搜索)或queue>(广度搜索),之后进行搜索:从stack>或queue>中取出
    首元素的点(stack>::top( )或queue>::front( ))并将地图上该点值置‘0’防止重复搜索,延伸上下
    左右的点,如果其在地图内且值为’1’则将坐标存入stack>或queue>,当stack>或
    queue>中元素为空时搜索结束将岛屿数ans加一;当所有的点遍历完成返回岛屿数。

  2. 题解参考:

如果文章侵犯了您的权益,请联系我删除。

你可能感兴趣的:(【力扣】岛屿数量)