我正在尝试使用直接方法创建一个算法,以查找 N x N 矩阵中的所有峰值。但是我遇到了一些问题,例如处理角落、第一行和最后一行以及第一列和最后一列。我将问题描述如下:
[ ][c][ ][ ] a is considered a 2d peak
[d][a][e][ ] or a hill iff a >= b,
[ ][b][ ][ ] a >= d, a >=c, a >=e
[ ][ ][ ][ ]
然而,在我需要将角落表示为下面的样子时,c和d不存在。我必须评估太多的条件才能得到更通用的内容。例如,对于下面的a,我需要检查位置a是否有效,如果row-1 < 0
,则我就不需要检查a上方的任何东西;如果col-1< 0,则左侧的任何内容都不需要检查。
[a][e][ ][ ]
[b][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
但是如果我们将位置a移到其他角落,甚至评估其他位置,例如上面的e,我需要确保e处于一个有效的位置,其中row-1存在,以防止评估该位置并获取错误(在上面的例子中,如果检查e >= row-1中的元素
,我肯定会出错)。我已经实现了一段考虑到角落、第0行和第n行以及第0列和第n列的代码,但是我停下来开始思考如何使它更易读和简单。
void find_hill(){
int i, j;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
//check corners
if(i-1 < 0){
if(j-1 < 0){
//check if arr[i][j] >= arr at i,j+1 and i+1,j
}
if(j+1 > n-1){
//check if arr[i][j] >= arr at i,j-1 and i+1,j
}
}
}
}
}
我想讨论如何在这里得出解决方案。我应该从哪里开始,以获得简单的东西?我想到了一种类似于洪水填充的方法,但它会分别填充每个位置,可能行不通,因为我最终会遇到相同的问题!
get(i, j, n)
,如果i
和j
是有效的,它将返回arr[i][j]
,否则返回INT_MIN
。 - M OehmINT_MIN
,您确保峰值测试将在边缘和角落找到峰值。但是,您仍然需要明确检查所有四个邻居。 - M OehmINT_MIN
。 (它不是 int 的最小大小,而是其最小可能值。这些和类似的常量在<limits.h>
中定义。)我本可以说“一个小值,您知道它比矩阵中的所有其他值都要小”。如果您的所有值都是正数,则该值可以为0。 - M Oehm