你的代码实现了一个深度优先搜索(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;
}
问题和修复说明
边界检查:在原始 DFS 函数中,第二个条件应该检查
land[x][y]
是否不等于某个值(例如非零),而不是简单地检查其是否存在。标记方式:将位置标记为已访问时,原本使用
land[x][y] = 1
,但这里建议使用其他值(如-1
),以避免与实际数据发生冲突。循环范围:原始代码中的嵌套循环会导致重复处理同一位置,应确保只处理相邻的八个方向,因此需要修改循环的范围和逻辑来排除自己。
返回计数:正确返回当前水坑的计数并在
pondSizes
中收集这些结果。
通过这些修正,你的程序应该能够正确找到每个水坑的大小,并且返回按顺序排列的结果。
内容由零声教学AI助手提供,问题来源于学员提问