我将如何通过检查周围的所有数字是否小于它来查找局部最大值来遍历二维数组?我真的很困惑我将如何在代码中做到这一点。我需要得到位置,我只需要局部最大值,而不是绝对最大值。
void reportMaxima(int rows, int cols, int grid[ rows ][ cols ])
{
}
这应该有效:
#include <stdbool.h>
#include <string.h>
void report_maxima(int rows, int cols, int arr_in[rows][cols],
bool arr_out[rows][cols])
{
int i, j;
int k, l;
memset(arr_out, 0, rows * cols * sizeof(arr_out[0][0]));
// memset(arr_out, 0, sizeof(arr_out)); I think this doesn't work :(
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
for (k = i - 1; k <= (i + 1); k++) {
if (k < 0)
continue;
if (k >= rows)
break;
for (l = j - 1; l <= (j + 1); l++) {
if (l < 0)
continue;
if (l >= cols)
break;
if (arr_in[i][j] < arr_in[k][l])
goto not_maxima;
}
}
arr_out[i][j] = true;
continue;
not_maxima:
}
}
}
首先,您需要一个bool
数组来存储输出信息:一个点是否是最大值 ( true
) 或不是 ( false
)。
在存储它所在的点之前,您需要将该数组初始化为0
( false
) true
。最好的方法是使用memset()
.
然后,您显然需要遍历输入数组。(i
并j
这样做)
对于输入数组的每个点,您检查所有邻居。(k
并l
这样做)。您需要确保您尝试访问的邻居在数组边界内(if - continue
并且if - break
这样做)。
然后,您检查所有这些邻居是否都小于您所在的点。您找到的第一个比您的点大的邻居告诉您您不在局部最大值中,您应该跳到下一个点。如果在检查了所有邻居之后你没有发现任何邻居大于你的点,那么你就处于局部最大值。(或至少在一个拐点)。
最后一件事很重要:如果你想确定,你应该添加很多检查,这会大大减慢算法的速度。这取决于您的需求。
编辑:
修复了使用不正确输入时的错误sizeof()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句