#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 生成】
这段代码在寻找矩阵中的局部最大值的过程中存在一些问题。下面是对问题的分析和一些优化建议:
a
的时候使用了变量 m
和 n
,这是不允许的,数组的大小必须是常量表达式。可以使用动态内存分配或者将矩阵的大小定义为常量。判断局部最大值的条件错误,应该是判断当前元素是否大于周围的元素,而不是大于上下左右四个元素。
优化建议:
基于以上的分析,下面是优化后的代码:
#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;
}
这样优化之后,程序应该能够更好地处理输入和寻找局部最大值了。如果还有其他问题,请随时提问。
【相关推荐】