鱼C论坛

 找回密码
 立即注册
查看: 1311|回复: 2

[已解决]求助一下

[复制链接]
发表于 2023-11-3 11:39:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

输入格式:
输入在第一行中给出矩阵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[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(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;
    }
}

我这个代码哪里错了
最佳答案
2023-11-3 11:40:04
你的代码有一些错误。首先,你没有考虑到边界情况,即矩阵的第一行、最后一行、第一列和最后一列的元素。其次,你在判断局部极大值时,没有考虑到相邻元素可能超出矩阵的范围。最后,你在判断局部极大值时,没有考虑到相邻元素可能相等的情况。

以下是修正后的代码:
#include <iostream>
using namespace std;

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

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

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

    return 0;
}

修正后的代码会正确地判断矩阵的局部极大值,并按照要求输出结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-3 11:40:04 | 显示全部楼层    本楼为最佳答案   
你的代码有一些错误。首先,你没有考虑到边界情况,即矩阵的第一行、最后一行、第一列和最后一列的元素。其次,你在判断局部极大值时,没有考虑到相邻元素可能超出矩阵的范围。最后,你在判断局部极大值时,没有考虑到相邻元素可能相等的情况。

以下是修正后的代码:
#include <iostream>
using namespace std;

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

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

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

    return 0;
}

修正后的代码会正确地判断矩阵的局部极大值,并按照要求输出结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-3 11:40:26 | 显示全部楼层
你的代码逻辑基本正确,但是在处理边界元素时出现了问题。具体来说,当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 的问题,并且不用关心具体的矩阵大小。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 23:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表