如何在JavaScript中选择二维矩阵的同心元素?

3
如何选择/分组一个2D矩阵中同心元素?
以下是创建2D数组的代码。
function Create2DArray(rows) {
  var arr = [];

  for (var i=0;i<rows;i++) {
     arr[i] = [];
  }

  return arr;
}

想象一个位于矩阵中心,地址为i,j的元素。

如何按以下方式分离出单元格?

enter image description here

即只突出显示的元素被分组/分离出来。

最好使用数学算法,而不是循环(这将更有效率)

注意

以上方法仅适用于矩阵大小为奇数的情况,即3 x 35 x 57 x 7等。因此,如果有一种方法可以实现大于3的偶数矩阵,请也提出建议(对于大于或等于4的矩阵,我们可以使用奇数大小的矩阵子集来实现上述算法并丢弃其余部分)。

请使用数学/指数来切割同心圆单元,而不是使用传统迭代器或类似物,因为这样可以进行更快速的计算(...因为您可以从中央地址(或索引)开始递减/增加)(如果可能,如果不可能,您可以提出任何方法)

可能的输出可以是相应单元格地址的数组或对象

像这样跨度:

index/key 1-> level 1 concentric cells
index/key 2-> level 2 concentric cells
index/key 3-> level 3 concentric cells
...

可能的输出结果只是遍历每个连续级别而不是分组出同心圆细胞; 比如,如果遍历了第一级别的同心圆细胞,那么就会执行alert(level 1)... 然后在第二级别之后执行alert(level 2)等等...

你也想用循环来解决这个问题吗? - Nenad Vracar
是的。当然。欢迎提出任何建议。 - mx_code
1个回答

0
你可以从中心点开始(可以是任何一行/列的点),然后循环每一行和列,并基于与该中心点的空间进行检查。

function genMatrix(rows, cols) {
  return Array.from(Array(rows), () => {
    return Array(cols).fill(0)
  })
}

function select(matrix, [cRow, cCol], space = 0) {
  for (let i = 0; i < matrix.length; i++) {
    for (let j = 0; j < matrix[i].length; j++) {
      if (space === 0) {
        // for center point
        if (i == cRow && j == cCol) {
          matrix[i][j] = 3
        }
      } else {
        // for horizontal points
        if (i == cRow - space || i == cRow + space) {
          if (j <= cCol + space && j >= cCol - space) {
            matrix[i][j] = 3
          }
        }

        // for vertical points
        if (j == cCol - space || j == cCol + space) {
          if (i <= cRow + space && i >= cRow - space) {
            matrix[i][j] = 3
          }
        }

      }
    }
  }

  return matrix
}


const center = [3, 3];

const result = [
  select(genMatrix(7, 7), center),
  select(genMatrix(7, 7), center, 1),
  select(genMatrix(7, 7), center, 2),
  select(genMatrix(7, 7), center, 3)
]

// for the demo
result.forEach(matrix => {
  matrix.forEach(row => console.log(JSON.stringify(row)))
  console.log('-'.repeat(20))
})


如果这不是一个奇数大小的矩阵呢? - mx_code
真的吗?这个支持偶数矩阵吗? - mx_code
有没有一种方法可以将每个同心级别分开? - mx_code
好的。很棒。我该如何在每次迭代中剪切出被占用的单元格,如果我正在填充它们... - mx_code
如果您拼接一个单元格(列),那么剩余单元格的计算将会出错,因为它期望矩阵的固定大小。不确定为什么您需要将它们拼接出来,您可以选择、修改、克隆,然后在基于行/列值的某个特定层上迭代所选单元格。 - Nenad Vracar
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接