岛屿数量(leetcode200)

题目

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

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

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

思考

采用bfs。过程为:在遍历整个图的时候,在遍历到1时,进行广度搜索遍历,搜索遍历所遇到的1全改为0;当这次广度遍历不再遍历到1时,则本次广度遍历结束,岛屿数量加一。遍历完整个图,只需要知道进行了多少广度优先遍历即可

代码

    typedef pair PII;
    int dx[4] = {0,1,-1,0},dy[4] = {1,0,0,-1};
    int ans = 0;
    queue q;
//检查是否越界
    bool check(int x,int y,int n,int m)
    {
        return x >= 0 && y >= 0 && x < n && y < m;
    }
    int numIslands(vector>& grid) {
        int n = grid.size();
        int m = grid[0].size();
        for(int i = 0;i < n;i++)
        {
            for(int j = 0;j < m;j++)
            {
                //遍历到1,准备进行广度优先遍历
                if(grid[i][j] == '1')
                {
                    ans++;
                    grid[i][j] = '0';
                    q.push({i,j});
                    //进行广度优先遍历
                    while(!q.empty())
                    {
                        auto temp = q.front();
                        q.pop();
                        for(int k = 0;k < 4;k++)
                        {
                            int x = temp.first + dx[k];
                            int y = temp.second + dy[k];
                            if(check(x,y,n,m) && grid[x][y] == '1')
                            {
                                grid[x][y] = '0';
                                q.push({x,y});
                            }
                        }
                    }
                }
            }
        }

        return ans;
    }

你可能感兴趣的:(搜索,算法,数据结构)