我有一个这样的2D阵列:
const matrix = [
[0, 0, 0, 0],
[0, 2, 1, 0],
[0, 1, 2, 0],
[0, 0, 0, 0]
]
如果给定了一个单元格的x
和y
,例如2
和1
(matrix[2][1]
是1
(,我如何找到穿过所提供单元格的所有对角线(两个数组,每个数组都包含对角线中每个单元格的点,顺序正确(?矩阵(数组(将始终是对称和正方形的(确切地说,我有一个8x8的网格(。
示例:
const matrix = [
[0, 0, 0, 0],
[0, 2, 1, 0],
[0, 1, 2, 0],
[0, 0, 0, 0]
];
const cellX = 2, cellY = 1;
// Code ...
const diagonalFromTopLeft = [0, 1, 0];
const diagonalFromTopRight = [0, 1, 1, 0]
如果你能找到每一条线,而不仅仅是对角线(垂直和水平,但我自己能算出(,那就有加分了。
您可以迭代行(和相应的索引(,并计算两条对角线上相应的x坐标。当它们在范围内时,可以将相应的值添加到相关数组:
function diagonals(matrix, cellX, cellY) {
let forward = []; // diagonal according forward slash shape: /
let backward = []; // diagonal according backslash shape:
let n = matrix.length;
matrix.forEach((row, y) => {
let x = cellX - (cellY - y);
if (x >= 0 && x < n) backward.push(row[x]);
x = cellX + (cellY - y);
if (x >= 0 && x < n) forward.push(row[x]);
});
return [forward, backward];
}
const matrix = [
[0, 0, 0, 0],
[0, 2, 1, 0],
[0, 1, 2, 0],
[0, 0, 0, 0]
];
const cellX = 2, cellY = 1;
console.log(diagonals(matrix, cellX, cellY));