ZBLOG

int dfs(vector>& land, int x, int y) { if (x < 0 || x >= land.size() || y < 0 || y >= land[x].size() || land[x][y]) return 0; land[x][y] = 1; int cnt0 = 1; for (int i = x - 1; i ...

你的代码实现了一个深度优先搜索(DFS)算法,用于计算二维网格中“水坑”的大小。这个代码存在一些问题,下面是修正后的代码和详细的解释。

修正后的 dfs 函数

int dfs(vector<vector<int>>& land, int x, int y) {
    // 检查边界条件以及当前位置是否已经被访问
    if (x < 0 || x >= land.size() || y < 0 || y >= land[0].size() || land[x][y] != 0)
        return 0;

    // 标记当前位置为已访问
    land[x][y] = -1; // 使用 -1 表示已访问
    
    int cnt = 1; // 当前水坑的大小
    // 遍历周围8个方向
    for (int i = -1; i <= 1; i++) {
        for (int j = -1; j <= 1; j++) {
            if (!(i == 0 && j == 0)) { // 排除自身位置
                cnt += dfs(land, x + i, y + j);
            }
        }
    }

    return cnt;
}

pondSizes 函数

public:
vector<int> pondSizes(vector<vector<int>>& land) {
    int m = land.size(), n = land[0].size();
    vector<int> ans;

    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            if (land[i][j] == 0) { // 找到未访问的位置
                ans.push_back(dfs(land, i, j)); // 调用DFS获取水坑大小
            }

    sort(ans.begin(), ans.end()); // 对结果进行排序
    return ans;
}

问题和修复说明

  1. 边界检查:在原始 DFS 函数中,第二个条件应该检查 land[x][y] 是否不等于某个值(例如非零),而不是简单地检查其是否存在。

  2. 标记方式:将位置标记为已访问时,原本使用 land[x][y] = 1,但这里建议使用其他值(如 -1),以避免与实际数据发生冲突。

  3. 循环范围:原始代码中的嵌套循环会导致重复处理同一位置,应确保只处理相邻的八个方向,因此需要修改循环的范围和逻辑来排除自己。

  4. 返回计数:正确返回当前水坑的计数并在 pondSizes 中收集这些结果。

通过这些修正,你的程序应该能够正确找到每个水坑的大小,并且返回按顺序排列的结果。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=19440

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?