有谁告诉我pta矩阵局部最大值那题这样做错在哪了,搞不清楚


#include<stdio.h>
int main()
{
    int m,n,c=0;
    scanf("%d %d",&m,&n);
    int a[m][n];
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            scanf("%d",&a[i][j]);
            }
        }
    for(int i=1;i<m-1;i++){
        for(int j=1;j<n-1;j++){
            if(a[i][j]>a[i-1][j]&&a[i][j]>a[i][j+1]&&a[i][j]>a[i+1][j]&&a[i][j]>a[i][j+1]){
                printf("%d %d %d\n",a[i][j],i+1,j+1);
                c++;
        }
    }
    }
        
           
    if(c==0){
        printf("None %d %d",m,n);
    }
    return 0;
}

【以下回答由 GPT 生成】

这段代码在寻找矩阵中的局部最大值的过程中存在一些问题。下面是对问题的分析和一些优化建议:

  1. 错误的地方:
  2. 定义矩阵 a 的时候使用了变量 mn,这是不允许的,数组的大小必须是常量表达式。可以使用动态内存分配或者将矩阵的大小定义为常量。
  3. 判断局部最大值的条件错误,应该是判断当前元素是否大于周围的元素,而不是大于上下左右四个元素。

  4. 优化建议:

  5. 使用动态内存分配来创建矩阵,可以根据用户输入的行列数来动态分配内存,避免了写死大小的问题。
  6. 对于边界元素,不需要再判断是否为局部最大值,因为边界元素无法判断是否大于周围元素。
  7. 在找到局部最大值时,可以直接打印出来,而不需要先存储起来再统一打印。
  8. 可以加入一些输入合法性的检查,例如输入的行列数应该大于等于3。

基于以上的分析,下面是优化后的代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int m, n, c = 0;

    // 输入行列数
    scanf("%d %d", &m, &n);

    // 输入合法性检查
    if (m < 3 || n < 3) {
        printf("Invalid input: m and n should be at least 3\n");
        return 0;
    }

    // 动态分配二维数组空间
    int **a = (int **)malloc(m * sizeof(int *));
    for (int i = 0; i < m; i++) {
        a[i] = (int *)malloc(n * sizeof(int));
    }

    // 输入矩阵
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    // 寻找局部最大值
    for (int i = 1; i < m - 1; i++) {
        for (int j = 1; j < n - 1; j++) {
            if (a[i][j] > a[i-1][j] && a[i][j] > a[i][j+1] && a[i][j] > a[i+1][j] && a[i][j] > a[i][j-1]) {
                printf("%d %d %d\n", a[i][j], i+1, j+1);
                c++;
            }
        }
    }

    // 没有找到局部最大值
    if (c == 0) {
        printf("None %d %d\n", m, n);
    }

    // 释放动态分配的内存
    for (int i = 0; i < m; i++) {
        free(a[i]);
    }
    free(a);

    return 0;
}

这样优化之后,程序应该能够更好地处理输入和寻找局部最大值了。如果还有其他问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^