首页 > 解决方案 > 我将如何通过检查周围的所有数字是否都小于它来找到局部最大值来遍历二维数组?

问题描述

我将如何通过检查周围的所有数字是否都小于它来找到局部最大值来遍历二维数组?我真的很困惑如何在代码中做到这一点。我需要得到这个位置,我只需要局部最大值,而不是绝对最大值。

void reportMaxima(int rows, int cols, int grid[ rows ][ cols ])
{

}

标签: cmultidimensional-array

解决方案


这应该有效:

#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( ) 。最好的方法是使用.falsetruememset()

然后,您显然需要遍历输入数组。(ij这样做)

对于输入数组的每个点,检查所有邻居。(kl这样做)。您需要确保您尝试访问的邻居在数组边界内(if - continue并且if - break这样做)。

然后,您检查所有这些邻居是否都小于您所在的点。您找到的第一个大于您的点的邻居告诉您您不在局部最大值中,您应该跳到下一个点。如果在检查了所有邻居之后,您还没有找到比您的点更大的邻居,那么您就处于局部最大值。(或至少在拐点)

最后一点很重要:如果你想确定,你应该添加很多检查,这会大大降低算法的速度。这取决于您的需求。

编辑:

修复了使用错误输入时的错误sizeof()


推荐阅读