题解 | #岛屿数量#

岛屿数量

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

class Solution {
  public:
//0跳,重复跳
    int dirt[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    int solve(vector<vector<char> >& grid) {
        int n = grid.size();
        int m = grid[0].size();
        int count = 0;
        queue<pair<int, int>> que;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid[i][j] == '1') {
                    grid[i][j] = '0';
                    que.push({i, j});
                    count++;//新岛屿数量加1
                    //bfs把岛屿相连部分去重
                    while (!que.empty()) {
                        auto tmp = que.front();
                        que.pop();
                        for (int k = 0; k < 4; k++) {
                            int nexti = tmp.first + dirt[k][0];
                            int nextj = tmp.second + dirt[k][1];
                            if (nexti >= 0 && nexti < n && nextj >= 0 && nextj < m &&
                                    grid[nexti][nextj] == '1') {
                                grid[nexti][nextj] = '0';
                                que.push({nexti, nextj}); //把一层的相关点压入
                            }
                        }
                    }
                }
            }
        }
        return count;
    }
};

dfs深度优先,遍历到1的时候分别往四个方向中一个合法方向下挖,到下一个点的时候依然重复下挖,表现深度优先,在遇到不合法情况则return回上一层合法点。所以,dfs以回溯的方式进行深度优先的遍历,加上已遍历过的情况记录,则为dp。

bfs广度优先,遍历到1的时候先把四个方向的合法点a先遍历,在遍历a的时候,用queue记录。此时,完成一层的遍历,并利用queue的记录,来开始下一层的遍历。

全部评论

相关推荐

北漂的牛马人:211佬,包进的,可能是系统问题
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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