yangzhixiaohuli 发表于 2023-11-3 11:39:21

求助一下

给定M行N列的整数矩阵A,如果A的非边界元素A大于相邻的上下左右4个元素,那么就称元素A是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。

输入格式:
输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。

输出格式:
每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。

输入样例1:
4 5
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 1 1 1
输出样例1:
9 2 3
5 3 2
5 3 4
输入样例2:
3 5
1 1 1 1 1
9 3 9 9 1
1 5 3 5 1
输出样例2:
None 3 5

#include<iostream>
using namespace std;
int main()
{
    int m,n;
    cin>>m>>n;
    int arr;int i,j;
    for(i=0;i<m;i++)
    {
      for(j=0;j<n;j++)
      {
            cin>>arr;
      }
    }
    int flag=1;
   for(i=0;i<m;i++)
    {
      for(j=0;j<n;j++)
      {
          if(arr>arr&&arr>arr&&arr>arr&&arr>arr)
          {flag=0;
            cout<<arr<<" "<<i+1<<" "<<j+1<<endl;
          }
            
            }
    }
    if(flag==1)
    {
      cout<<"None "<<m<<" "<<n<<endl;
    }
}

我这个代码哪里错了

isdkz 发表于 2023-11-3 11:40:04

你的代码有一些错误。首先,你没有考虑到边界情况,即矩阵的第一行、最后一行、第一列和最后一列的元素。其次,你在判断局部极大值时,没有考虑到相邻元素可能超出矩阵的范围。最后,你在判断局部极大值时,没有考虑到相邻元素可能相等的情况。

以下是修正后的代码:

#include <iostream>
using namespace std;

int main() {
    int m, n;
    cin >> m >> n;
    int arr;
    for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++) {
            cin >> arr[ i];
      }
    }

    bool hasLocalMax = false;
    for (int i = 1; i < m - 1; i++) {
      for (int j = 1; j < n - 1; j++) {
            if (arr[ i] > arr && arr[ i] > arr && arr[ i] > arr[ i] && arr[ i] > arr[ i]) {
                hasLocalMax = true;
                cout << arr[ i] << " " << i + 1 << " " << j + 1 << endl;
            }
      }
    }

    if (!hasLocalMax) {
      cout << "None " << m << " " << n << endl;
    }

    return 0;
}


修正后的代码会正确地判断矩阵的局部极大值,并按照要求输出结果。

Mike_python小 发表于 2023-11-3 11:40:26

你的代码逻辑基本正确,但是在处理边界元素时出现了问题。具体来说,当i=0时,你访问了数组arr的上一行,导致数组越界。

为了解决这个问题,你需要在遍历矩阵元素之前,先判断当前元素是否处于边界位置。如果是边界元素,则直接跳过判断是否为局部极大值的步骤。

下面是修改后的代码:

++
#include<iostream>
using namespace std;

int main() {
    int m, n;
    cin >> m >> n;
    int arr;
    int i, j;
    for (i = 0; i < m; i++) {
      for (j = 0; j < n; j++) {
            cin >> arr;
      }
    }
    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 > arr && arr > arr && arr > arr && arr > arr) {
                flag = 0;
                cout << arr << " " << 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;
      }
    }

    int flag = 1;
    for (int i = 1; i < m - 1; i++) {
      for (int j = 1; j < n - 1; j++) {
            if (arr > arr && arr > arr && arr > arr && arr > arr) {
                flag = 0;
                cout << arr << " " << i + 1 << " " << j + 1 << endl;
            }
      }
    }

    if (flag == 1) {
      cout << "None " << m << " " << n << endl;
    }

    return 0;
}


这个版本的代码使用了 std::vector 来定义二维矩阵,可以避免 VLA 的问题,并且不用关心具体的矩阵大小。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 求助一下