C++ 代码 MLE 错误分析:深度优先搜索 (DFS) 导致内存溢出
这段代码可能会 MLE(Memory Limit Exceeded)是因为在递归调用 dfs 函数时,不断地创建新的函数调用栈,导致内存使用量增加。递归调用的层数过多或者每层递归调用中的局部变量占用过多的内存,都可能导致内存溢出。解决方法可以尝试使用迭代或者优化内存使用方式。
这段代码实现了在一个二维字符矩阵中,从左上角 (1, 1) 到右下角 (a, b) 的路径查找,其中 # 表示障碍物。代码使用 dfs 函数进行深度优先搜索,但是由于递归调用层数过多,可能会导致内存溢出。
优化方法:
- 使用迭代代替递归: 可以使用栈数据结构来模拟递归调用,避免创建新的函数调用栈。
- 优化内存使用方式: 可以使用指针或引用来传递参数,避免在递归调用中创建新的变量副本。
- 剪枝优化: 可以添加一些剪枝条件,例如判断当前位置是否已经访问过,或者是否已经超出边界,来减少递归调用的次数。
示例代码(使用迭代):
#include <bits/stdc++.h>
using namespace std;
#define N 105
bool dfs(char x[N][N], int a, int b) {
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
stack<pair<int, int>> st; // 使用栈模拟递归调用
st.push(make_pair(1, 1));
while (!st.empty()) {
int y = st.top().first;
int z = st.top().second;
st.pop();
if (x[y][z] == '#') {
continue;
}
if (y == a && z == b) {
return true;
}
x[y][z] = '#'; // 标记为已访问
for (int i = 0; i < 4; i++) {
int newY = y + dy[i];
int newZ = z + dx[i];
if (newY >= 1 && newY <= a && newZ >= 1 && newZ <= b && x[newY][newZ] != '#') {
st.push(make_pair(newY, newZ));
}
}
}
return false;
}
int main() {
int a, b;
cin >> a >> b;
char c[N][N];
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= b; j++) {
cin >> c[i][j];
}
}
if (dfs(c, a, b)) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
原文地址: https://www.cveoy.top/t/topic/lSS 著作权归作者所有。请勿转载和采集!