你的代码逻辑基本正确,但是在处理边界元素时出现了问题。具体来说,当i=0时,你访问了数组arr的上一行,导致数组越界。
为了解决这个问题,你需要在遍历矩阵元素之前,先判断当前元素是否处于边界位置。如果是边界元素,则直接跳过判断是否为局部极大值的步骤。
下面是修改后的代码:++#include<iostream>using namespace std;int main() { int m, n; cin >> m >> n; int arr[m][n]; int i, j; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { cin >> arr[i][j]; } } int flag = 1; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { if (i == 0 || i == m - 1 || j == 0 || j == n - 1) { // 处理边界元素 continue; } if (arr[i][j] > arr[i][j + 1] && arr[i][j] > arr[i][j - 1] && arr[i][j] > arr[i - 1][j] && arr[i][j] > arr[i + 1][j]) { flag = 0; cout << arr[i][j] << " " << i + 1 << " " << j + 1 << endl; } } } if (flag == 1) { cout << "None " << m << " " << n << endl; } return 0;}
这样修改后的代码应该可以正常运行并得到正确的输出。
值得一提的是,你的代码中使用了变长数组(Variable Length Array,VLA),这在一些编译器中是支持的,但不是标准的 C++ 特性。如果你的编译器不支持 VLA,可能会导致编译错误。为了保险起见,你可以将数组 arr 的大小定义为常量或动态分配内存。例如,可以使用 std::vector 容器来代替数组的使用:++#include <iostream>#include <vector>using namespace std;int main() { int m, n; cin >> m >> n; vector<vector<int>> arr(m, vector<int>(n)); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cin >> arr[i][j]; } } int flag = 1; for (int i = 1; i < m - 1; i++) { for (int j = 1; j < n - 1; j++) { if (arr[i][j] > arr[i][j + 1] && arr[i][j] > arr[i][j - 1] && arr[i][j] > arr[i - 1][j] && arr[i][j] > arr[i + 1][j]) { flag = 0; cout << arr[i][j] << " " << i + 1 << " " << j + 1 << endl; } } } if (flag == 1) { cout << "None " << m << " " << n << endl; } return 0;}
这个版本的代码使用了 std::vector 来定义二维矩阵,可以避免 VLA 的问题,并且不用关心具体的矩阵大小。
球一个最佳答案谢谢啦!这对我非常重要! |