【问题标题】:Taking minimum value of neighboring cells取相邻单元格的最小值
【发布时间】:2017-01-11 21:10:53
【问题描述】:

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

例如,我有一个二维数组,我正在专门查看 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] 单元格。我尝试了很多条件,但都没有奏效。

我想到并尝试实现的另一件事是添加一个一维数组,该数组存储所有相邻单元格的值(如果小于数组的大小 - 存储 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*/    
                    }
                }
            }
        }
    }
}

非常感谢任何帮助。

【问题讨论】:

  • 在通常意义上的array[N][M] 中,y 的含义通常是行,x 是列,您似乎将索引限制与错误的维度进行比较。我希望yN 相关联,xM 相关联。
  • 我可以翻转名称,然后 y 将代表行和 x 列。那没问题。我会更新我的代码。
  • 如果矩阵不是方阵,以后有问题了。
  • 我更习惯将 xs 视为行。如果更容易理解,我更改了代码。
  • int minval = mat[0][0]; 开头,/*CONDITION TO TAKE MINIMUM*/ 可以是if(minval &gt; mat[y+j][x+i]) { minval = mat[y+j][x+i];}

标签: c arrays function multidimensional-array


【解决方案1】:

1) matr[N][M] 它没有像matr[?][M]matr[N][?] 这样的元素,因为编号是从0N-1(或M-1)。所以你应该改变条件y+i&lt;=Ny+i&lt;Nx+j&lt;=Mx+j&lt;M

2) 要检查您没有查看单元格[y][x] 本身,您应该检查if(!(i == 0 &amp;&amp; j == 0)) 或等效的if(i != 0 || j != 0) 而不是if(x+i != 0 &amp;&amp; y+j != 0)

3) 要找到最小值,首先在函数开始处设置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;

【讨论】:

  • 几个问题:为什么不使用 if(x+i != 0 && y+j != 0)?这种情况保证我看到的是邻居而不是单元格本身。另外,我不允许与其他图书馆合作。这将如何改变 mat[y][x] 的值?我在任何地方都没有看到它。
  • 您不想查看单元格本身?我编辑了答案(第 2 项)
  • 没有。查看上面的示例,我将其编辑为之前的内容和之后的内容。我希望这能让我说的清楚。
  • 在示例中,我看到您不想在找到最小值时考虑[y][x] 单元格。在我回答的第二项中,我写了如何做到这一点
  • 我想要 [y][x] 周围的最小壁橱单元格,然后将该最小值存储在 mat[y][x]
猜你喜欢
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
相关资源
最近更新 更多