C 取相邻单元的最小值

C 取相邻单元的最小值,c,arrays,function,multidimensional-array,C,Arrays,Function,Multidimensional Array,我正在尝试编写一个函数,它接收一些矩阵[N][m](N和m在开始时定义,它们总是3),两个整数,并将相邻单元格的最小值(水平、垂直和对角)返回到特定(y,x)单元格(该函数是取特定(y,x)的较大代码的一部分)而不是任何(y,x)。它在某些特定情况下被称为二维数组中的最小值(int mat[N][M],int y,int x) 比如说,我有一个2D数组,我特别关注0,0元素 1109 18910 19108 我希望该单元格更改为9,因为它是相邻单元格中的最小值(单元格本身并不关心它是否是所有单元

我正在尝试编写一个函数,它接收一些矩阵[N][m](N和m在开始时定义,它们总是3),两个整数,并将相邻单元格的最小值(水平、垂直和对角)返回到特定(y,x)单元格(该函数是取特定(y,x)的较大代码的一部分)而不是任何(y,x)。它在某些特定情况下被称为二维数组中的最小值(int mat[N][M],int y,int x)

比如说,我有一个2D数组,我特别关注0,0元素

1109

18910

19108

我希望该单元格更改为9,因为它是相邻单元格中的最小值(单元格本身并不关心它是否是所有单元格中的最小值),所以数组变为

9109

18910

19108

我尝试的是:首先我检查了每个相邻的单元。之后,我主要尝试将相邻单元格的值存储在其他变量中

tmp=mat[y+i][x+j]
它在每次迭代中都会发生变化,然后在其之后添加一些if条件,将最小值带到
mat[y][x]=mat[y+i][x+j]
单元格中。我尝试了很多条件,但都不起作用

我想到并尝试实现的另一件事是添加一个1D数组,该数组存储所有相邻单元格的值(若小于数组大小,则存储0),然后检查除0以外的每两个单元格之间的最小值。代码被打乱了,我弄不清楚该把那个数组的循环放在哪里

我用下面的方法检查了一些特定y,x细胞的相邻细胞:

Min(int mat[N][M], int y, int x)
{
    for(i=-1;i<=1;i++)
    {
        if((y+i>=0) && (y+i<=N))
        {
            for(j=-1;j<=1;j++)
            {
                if((x+j>=0) && (x+j<=M))
                {
                    if((x+i != 0) && (y+j != 0))
                    {
                        /*CONDITION TO TAKE MINIMUM*/    
                    }
                }
            }
        }
    }
}
Min(int mat[N][M],int y,int x)
{

对于(i=-1;i=0)和&(y+i1)
matr[N][M]
它没有
matr[?][M]
matr[N][?]
这样的元素,因为计算是从
0
N-1
(或
M-1
)的。所以你应该改变条件
y+iIn通常意义上的
数组[N][M]
,当
y
的含义通常是行而
x
是列时,您似乎将索引限制与错误的维度相比较。我希望
y
N
相关联,而
x
M
相关联。我可以翻转名称,然后y将代表行和x列。这就是没问题。我会更新我的代码。如果矩阵不是正方形,这将是未来的问题。我更习惯于将x视为行。如果更容易理解,我会更改代码。从
int minval=mat[0][0];
开始,其中
/*条件取最小值*/
可以有
if(minval>mat[y+j][x+I]){minval=mat y+j][x+I];]
几个问题:为什么不使用if(x+i!=0&&y+j!=0)?此条件保证我查看的是邻居而不是单元格本身。此外,我不允许使用其他库。这将如何更改mat[y][x]的值?我在任何地方都看不到它。您不想查看单元格本身吗?我编辑了答案在上面的例子中,我把它编辑成我之前的和我想要的。我希望这能使我所说的更清楚。在这个例子中,我发现你不想考虑<代码> [y] [x] < /Cord>单元格,而找到最小值。在我回答的第二个项目中,我写了如何做iTi需要最小的壁橱单元[y] [x]。然后是存储在mat[y][x]中的最小值
if (mat[y+i][x+j] < min)
    min = mat[y+i][x+j];
int u = max(0, y - 1), d = min(y + 1, N - 1);
int l = max(0, x - 1), r = min(x + 1, M - 1);
for (i = d; i <= u; i++)
    for (j = l; j <= r; j++)
        if (i != y || j != x)
            if (mat[i][j] < min)
                min = mat[i][j];
return min;