【问题标题】:Is there a better way to scan the surrounding elements of every element in a 2D array?有没有更好的方法来扫描二维数组中每个元素的周围元素?
【发布时间】:2020-10-17 19:33:54
【问题描述】:

我有一个二维矩阵A[row][col]。假设它仅包含布尔值。
我想遍历每个元素。对于每次迭代,它将扫描该元素的 8 个周围元素,并计算 True 值的数量。让我们忽略计数器进程。

// scanning element A[i][j]
counter = countHowManyTrue(A[i+1][j], A[i-1][j], A[i][j+1], A[i][j-1]... and so on)

除第一行、最后一行、第一列和最后一列外,其他每个元素都有 8 个周围元素。所以我必须写 if-else 语句来检查,像这样:

for (i = 0; i < m; i++){
   for(j = 0; j < n; j++){
      if(i == 0 && j == 0){ // first row, first col
      // do sth
      }
      if(i == m && j == 0){
      //do sth
      }
   }
}

而且我必须多次重复 if-else 语句来检查边缘情况,这非常耗时。
有没有更好的方法来做到这一点?

【问题讨论】:

    标签: arrays algorithm matrix


    【解决方案1】:

    正如其他人提到的,您可以用零边框填充矩阵,这样就不会出现边缘情况:

    如果空间不是问题,还有另一个加速,而不是为每个单元格查找 8 个邻居,我们实际上可以通过一些预先计算在更少的操作中获得邻居值的总和。

    让我们在每个矩阵单元格中(添加 0 个边框后)保持角落元素的总和 0,0 做起来很简单:

     //lets assume matrix was of size n*m before padding with border of zeroes twice
     for(int i=2; i<=n+2; i++)
     for(int j=2; j<=m+2; j++)
       matrix[i][j] += matrix[i-1][j] + matrix[i][j-1] - matrix[i-1][j-1]
    

    现在获得一些细胞邻居只是一些数学运算,假设我们想要某个细胞的邻居x,y,我们可以通过matrix[x+1][y+1] - matrix[x-2][y] - matrix[x][y-2] + matrix[x-2][y-2] - matrix[x][y]得到它

    与最初的 8 相比,现在每个单元格只需要 7 加法/减法

    【讨论】:

      【解决方案2】:

      执行此操作的最简单方法之一是添加标记行和列:真实数据上方和下方全为零的行。那你就不需要特例了。

      【讨论】:

      • 这通常在象棋之类的棋盘游戏中完成,以使移动生成更容易编码。但你也需要它在左边和右边。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多