取相邻单元的最小值

时间:2017-01-11 21:10:53

标签: c arrays function multidimensional-array

我正在尝试编写一个函数,它接收一些矩阵[N] [M](N和M在开头定义,它们都是3),两个整数并返回相邻单元格的最小值(水平,垂直和对角)到特定的(y,x)单元格(该函数是一个较大的代码的一部分,它采用特定的(y,x)s而不是任何(y,x)。在某些特定情况下调用它)在2D数组中 - 最小(int mat [N] [M],int y,int x)。

比方说,我有2D数组,我正在寻找0,0元素

1 10 9

18 9 10

19 10 8

我希望那个单元格变为9,因为它是相邻单元格的最小值(单元格本身并不重要,如果它们是最小的全部或不是),所以数组变为

9 10 9

18 9 10

19 10 8

我尝试了什么:首先我去了每个相邻的牢房。之后,我主要尝试将该相邻单元格的值存储在其他变量

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*/    
                    }
                }
            }
        }
    }
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

1)matr[N][M]它没有matr[?][M]matr[N][?]等元素,因为数字来自0N-1(或M-1 )。因此,您应将条件y+i<=N更改为y+i<N,将x+j<=M更改为x+j<M

2)要检查您是否没有查看单元格[y][x]本身,您应该检查if(!(i == 0 && j == 0))或相当于if(i != 0 || j != 0)而不是if(x+i != 0 && y+j != 0)

3)在函数开头找到最小的第一个make int min = INT_MAX;条件最小将是

if (mat[y+i][x+j] < min)
    min = mat[y+i][x+j];

4)要将最小值写入单元格[y][x],请在主函数或您想要的位置使用matr[y][x] = Min(matr, y, x);

或者,您可以通过以下方式遍历所有可能的单元格[i][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;