题解 | 数水坑

数水坑

https://www.nowcoder.com/practice/664ca4289fcf457ba3109fdf4a7a1a05

这道题实际上还是前一道题为核心,也就是利用BFS

本题思路是利用双重for循环遍历整个n*m田地,找到未被遍历过的水格子,作为走迷宫的“起点”。因为这是靠外循环找到的未被遍历的水格子,所以肯定是形成新水坑,那么水坑数量+1。

然后把起点塞入队列,弹出队首元素,检查它八连通区域有没有其他未被遍历的水格子,有的话就把它也标记为遍历过,同时也塞入队列,在以后弹出队列元素时就会把这些水格子也弹出来,然后就又能找出它的八连通区域的所有水格子,

最后当队列为空时,所有这些水格子就都属于一个水坑啦。

依靠着外循环遍历整个田地,我们很快就能找到所有水坑数,代码如下:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m;
    cin >> n >> m;
    vector<string> s(n);
    for (int i = 0; i < n; i++) {
        cin >> s[i];
    }
    vector<vector<int>> visited(n, vector<int>(m, 0)); // 标记当前元素是否被遍历过
    int dx[8] = {1, -1, 0, 0, 1, 1, -1, -1};
    int dy[8] = {0, 0, 1, -1, 1, -1, 1, -1};
    queue<pair<int, int>> a; // 队列,记录所有是w的格子
    int cnt = 0; // 记录水坑数量
    for(int i = 0; i < n; i++){ // 两个循环记录每个格子是否遍历
        for(int j = 0; j < m; j++){
            if(s[i][j] == 'W' && visited[i][j] == 0){
                cnt++; // 新的水坑
                a.push({i, j}); // 压入队列
                while(!a.empty()){ // 只要队列非空,我就一直循环找新水格子
                    pair<int, int> curr = a.front();
                    a.pop();
                    int x = curr.first;
                    int y = curr.second;
                    for(int z = 0; z < 8; z++){
                        int mx = x + dx[z];
                        int my = y + dy[z];
                        if(!(mx < 0 || my < 0 || mx >= n || my >= m)){ // 没出界
                            if(s[mx][my] == 'W' && visited[mx][my] == 0){
                                // 没被遍历过且为水格子
                                a.push({mx, my}); // 压入新的水格子
                                visited[mx][my] = 1;
                            }
                        }
                    }
                }                
                visited[i][j] = 1; // 每次遍历到它必定标记为1
            }
        }
    }
    cout << cnt;
    return 0;    
}

全部评论

相关推荐

NBA球星伦纳德:jd是这样的,工作连拧螺丝都算不上
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
11099次浏览 95人参与
# 你的实习产出是真实的还是包装的? #
1960次浏览 42人参与
# 米连集团26产品管培生项目 #
6042次浏览 216人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7644次浏览 43人参与
# 简历第一个项目做什么 #
31750次浏览 341人参与
# 重来一次,我还会选择这个专业吗 #
433557次浏览 3926人参与
# MiniMax求职进展汇总 #
24122次浏览 309人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187217次浏览 1122人参与
# 牛客AI文生图 #
21452次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152461次浏览 888人参与
# 研究所笔面经互助 #
118967次浏览 577人参与
# 简历中的项目经历要怎么写? #
310376次浏览 4219人参与
# AI时代,哪些岗位最容易被淘汰 #
63853次浏览 828人参与
# 面试紧张时你会有什么表现? #
30516次浏览 188人参与
# 你今年的平均薪资是多少? #
213147次浏览 1039人参与
# 你怎么看待AI面试 #
180154次浏览 1258人参与
# 高学历就一定能找到好工作吗? #
64334次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76547次浏览 374人参与
# 我的求职精神状态 #
448145次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363525次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160683次浏览 1112人参与
# 校招笔试 #
471238次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务