20.4.20 岛屿数量 中等 200

题目

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。

示例 1:
输入:
11110
11010
11000
00000
输出: 1

示例 2:
输入:
11000
11000
00100
00011
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

解题思路

  1. 思路就是广度搜索,大概的代码思路都看得懂;
  2. 主要是置0这一点要注意。置零相当于visited,就是已经访问过的点就置零。注意一定要在push的时候就置零,在pop的时候再置零是错误的。因为一个点pop出来后,会从这个点的四个方向找1,再放进队列,这样子在某种情况下会造成死循环,因为有可能一个点多次放进队列中。

代码

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        if(!grid.size()) return 0;
        queue<pair<int,int>> bfs;
        int count=0;
        for(int i=0; i<grid.size(); i++){
            for(int j=0; j<grid[0].size(); j++){
                if(grid[i][j]=='1'){
                    count++;
                    bfs.push({i,j});
                    grid[i][j]='0';
                    while(!bfs.empty()){
                        pair<int,int> pairIndex=bfs.front();
                        bfs.pop();
                        int row=pairIndex.first, col=pairIndex.second;
                        if(row!=0 && grid[row-1][col]=='1'){
                            bfs.push({row-1,col});
                            grid[row-1][col]='0';
                        }  
                        if(col!=0 && grid[row][col-1]=='1'){
                            bfs.push({row,col-1});
                            grid[row][col-1]='0';
                        }
                        if(row<grid.size()-1 && grid[row+1][col]=='1'){
                            bfs.push({row+1,col});
                            grid[row+1][col]='0';
                        }
                        if(col<grid[0].size()-1 && grid[row][col+1]=='1'){
                            bfs.push({row,col+1});
                            grid[row][col+1]='0';
                        }
                    }
                }
            }
        }

        return count;
    }
};
posted @ 2020-04-20 18:52  肥斯大只仔  阅读(101)  评论(0编辑  收藏  举报