力扣 leetcode 200. 岛屿数量

问题描述

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

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

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

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值为 '0' 或 '1'

示例

示例 1:

输入:grid = [
  ["1","1","1","1","0"],
  ["1","1","0","1","0"],
  ["1","1","0","0","0"],
  ["0","0","0","0","0"]
]
输出:1

示例 2:

输入:grid = [
  ["1","1","0","0","0"],
  ["1","1","0","0","0"],
  ["0","0","1","0","0"],
  ["0","0","0","1","1"]
]
输出:3

解题思路

这题要做的就是对图进行遍历,可以用深度优先搜索(DFS),也可以用广度优先搜索(BFS)。使用 DFS 时,用 保存下一个要遍历的位置;使用 BFS 时,使用 队列 保存下一个要遍历的位置。我们在遍历图时,将所有的 '1' 置为另一个符号,以避免重复遍历,统计最终我们的遍历次数即可。

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        stack<pair<int, int>> s; // DFS
        int res = 0;
        for(int i = 0; i < grid.size(); i++){
            for(int j = 0; j < grid[0].size(); j++){
                if(grid[i][j] == '1'){
                    res++; 
                    s.emplace(i, j); // 插入DFS的起点
                    grid[i][j] = 0;
                    while(!s.empty()){
                        pair<int, int> p = s.top();
                        s.pop();
                        if(p.first < (grid.size() - 1) && grid[p.first + 1][p.second] == '1'){ // 判断下方向是否是陆地
                            s.emplace(p.first + 1, p.second);
                            grid[p.first + 1][p.second] = 0;
                        }
                        if(p.first > 0 && grid[p.first - 1][p.second] == '1'){ // 判断上方向是否是陆地
                            s.emplace(p.first - 1, p.second);
                            grid[p.first - 1][p.second] = 0;
                        }
                        if(p.second < (grid[0].size() - 1) && grid[p.first][p.second + 1] == '1'){ // 判断左方向是否是陆地
                            s.emplace(p.first, p.second + 1);
                            grid[p.first][p.second + 1] = 0;
                        }
                        if(p.second > 0 && grid[p.first][p.second - 1] == '1'){ // 判断右方向是否是陆地
                            s.emplace(p.first, p.second - 1);
                            grid[p.first][p.second - 1] = 0;
                        }
                    }
                }
            }
        }
        return res;
    }
};
posted @ 2022-12-04 16:54  greatestchen  阅读(23)  评论(0编辑  收藏  举报