如何选择/组合二维矩阵的同心元素?
以下是创建二维数组的代码。
function Create2DArray(rows) {
var arr = [];
for (var i=0;i<rows;i++) {
arr[i] = [];
}
return arr;
}
假设一个元素位于矩阵的中心,地址为 i,j
。
如何按以下方式分离细胞?
这样只有突出显示的元素被组合在一起/分开。
如果一个数学算法,而不是循环很多,那就太好了。 (因为这样会更有效率)
注意
上述方法仅在矩阵大小为奇数时有效,即 3 x 3
、5 x 5
、7 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)
等等...
最佳答案
您可以从中心点(可以是行/列的任何点)开始,然后循环每一行和每一列,并根据距该中心点的空间进行检查。
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))
})
关于javascript - 如何在 javascript 中选择二维矩阵的同心元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64297652/