我有一个二维数组,其中随机包含0或1的值。

我如何(最有效地)确定值1的最低元素(最大的行迭代i)和最右边的元素(最高的列迭代j)?

例如:

 0  0  1  0
 1  0  1  0
 0  1  0  0
 1  0  0  0


我的程序应该回答i = 3(假设第一行是i = 0)和j = 2(假设第一列是0)。

最佳答案

这是一个主意:


从最底端的行开始,使用memrchr查找每一行的最后一个1(我假设您将数字存储为char aka 8位整数)。
最终,您将找到一个包含1的行。这是您对i的回答。由于C使用行优先的顺序,因此我们使用了缓存友好的一次行操作实现了这一目标。
在上方,您现在还知道了j的下限(因为您在最后一行中找到了具有任何1的最后一个1)。
对于其余的行,从memrchr的下限开始到每一行的末尾使用j。如果在那里找到任何1,请更新下限。重复直到检查完所有行。
当然,如果您在最后一栏中找到1,则可以立即停止。

关于c - 仅包含0或1的2D数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26506344/

10-11 16:00