leetcode题解-200.岛屿数量

文章目录

  • 题目描述
  • 思路解析
  • 示例代码


博客专栏地址:https://blog.csdn.net/feng964497595/category_9848847.html
github地址:https://github.com/mufeng964497595/leetcode


题目描述

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

示例

输入:
11110
11010
11000
00000
输出: 1

思路解析

  1. 其实看到这道题,网格、连接、搜索,就是很经典的图的遍历,bfs算法或者dfs算法就可以解决,也不需要额外做什么变化,直接套进去用就行了。算是一道签到题吧。

示例代码

class Solution {
public:
    int numIslands(vector>& grid) {
        if (grid.empty()) return 0;
        int width = grid.size();
        int height = grid[0].size();
        vector> visit(width, vector(height, false));

        // bfs
        int ans = 0;
        int dirx[] = {0, 1, 0, -1}, diry[] = {1, 0, -1, 0};
        for (int i = 0; i < width; ++i) {
            for (int j = 0; j < height; ++j) {
                if (visit[i][j] || '0' == grid[i][j]) continue;

                queue qu;
                qu.push(Node(i, j));
                while (!qu.empty()) {
                    Node node = qu.front();
                    qu.pop();
                    if (visit[node.x][node.y]) continue;
                    visit[node.x][node.y] = true;
                    for (int k = 0; k < 4; ++k) {
                        int x = node.x + dirx[k];
                        int y = node.y + diry[k];
                        if (x < 0 || x >= width || y < 0 || y >= height
                                || visit[x][y] || '0' == grid[x][y])
                            continue;
                        qu.push(Node(x, y));
                    }
                }
                ++ans;
            }
        }

        return ans;
    }

private:
    struct Node {
        int x, y;

        Node(int xx = 0, int yy = 0) : x(xx), y(yy) {
        }
    };
};

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