题解 | #岛屿数量#

岛屿数量

https://www.nowcoder.com/practice/0c9664d1554e466aa107d899418e814e

#include <utility>
class Solution {
  public:
    int solve(vector<vector<char> >& grid) {
        set<pair<int, int>> recxy; // 用于记录被搜索到的坐标
        int res = 0;
        for (int j = 0; j < grid.size(); j++) {// y
            for (int i = 0; i < grid[0].size(); i++) { // x
                if (!hasRec(recxy, i, j) && grid[j][i] == '1') {
                    dfs(grid, i, j, recxy);
                    res++;
                }
            }
        }
        return res;
    }
    void dfs(vector<vector<char> >& grid, int x, int y,
             set<pair<int, int>>& recxy) { //深度优先搜索
        vector<pair<int, int>> xystack;
        pair<int, int> xy(x, y), tmp;
        xystack.push_back(xy);
        recxy.insert(xy);
        int xtmp, ytmp;
        while (!xystack.empty()) {
            xy = xystack.back();
            xtmp = xy.first;
            ytmp = xy.second;
            if (valid(grid, xtmp - 1, ytmp) && !hasRec(recxy, xtmp - 1, ytmp) &&
                    grid[ytmp][xtmp - 1] == '1') {
                tmp.first = xtmp - 1;
                tmp.second = ytmp;
                xystack.push_back(tmp);
                recxy.insert(tmp);
                continue;
            }
            if (valid(grid, xtmp, ytmp - 1) && !hasRec(recxy, xtmp, ytmp - 1) &&
                    grid[ytmp - 1][xtmp] == '1') {
                tmp.first = xtmp;
                tmp.second = ytmp - 1;
                xystack.push_back(tmp);
                recxy.insert(tmp);
                continue;
            }
            if (valid(grid, xtmp + 1, ytmp) && !hasRec(recxy, xtmp + 1, ytmp) &&
                    grid[ytmp][xtmp + 1] == '1') {
                tmp.first = xtmp + 1;
                tmp.second = ytmp;
                xystack.push_back(tmp);
                recxy.insert(tmp);
                continue;
            }
            if (valid(grid, xtmp, ytmp + 1) && !hasRec(recxy, xtmp, ytmp + 1) &&
                    grid[ytmp + 1][xtmp] == '1') {
                tmp.first = xtmp;
                tmp.second = ytmp + 1;
                xystack.push_back(tmp);
                recxy.insert(tmp);
                continue;
            }
            xystack.pop_back();
        }
    }
    bool hasRec(set<pair<int, int>>& recxy, int x, int y) { //判断是否被记录
        pair<int, int> xy(x, y);
        return recxy.find(xy) != recxy.end();
    }
    bool valid(vector<vector<char> >& grid, int x, int y) { //判断坐标是否超出矩阵尺寸
        return x >= 0 && y >= 0 && x < grid[0].size() && y < grid.size();
    }

};

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务