我正在尝试编写一个函数,它接收一些矩阵[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*/
}
}
}
}
}
}
非常感谢任何帮助。
答案 0 :(得分:0)
1)matr[N][M]
它没有matr[?][M]
和matr[N][?]
等元素,因为数字来自0
到N-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;