c - 我将如何通过检查周围的所有数字是否都小于它来找到局部最大值来遍历二维数组?
问题描述
我将如何通过检查周围的所有数字是否都小于它来找到局部最大值来遍历二维数组?我真的很困惑如何在代码中做到这一点。我需要得到这个位置,我只需要局部最大值,而不是绝对最大值。
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()
。
推荐阅读
- javascript - 如何在过滤器中添加索引值
- python-3.x - 防止python在sql查询中转义引号
- vue.js - bootstrap-vue:大多数图标没有显示
- api - Asp.net core 2.2 API错误请求匹配多个端点
- python - 如何组合两个 Python 脚本
- html - 部分填充的 HTML5 日期选择器提交为完全空白
- reactjs - 隐藏底部选项卡而不使用 tabBarVisible 与多个堆栈反应本机
- laravel - strncmp() 期望参数 1 是给定 laravel 5.8 的字符串数组
- c# - c# 9.0 记录 - 反射和泛型约束
- macos - 在 Mac OS 终端 zsh 中出现权限错误