[英]Find the diagonals in an array that is a representation of a 2d array
我将我的2d数组转换为1d数组。 例如:(从0开始,而不是1);
00 01 02 03 04
05 06 07 08 09
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
被转换为1d数组。 [0,1,2,3,4 ...... 23,24]。
我现在正在尝试创建一个函数,找到“连接”或数组中某个元素旁边的每个点。 这包括与其对角的元素。 所以使用上面的2d数组,如果我想要一个连接到0的元素数组,我希望该函数返回数组[1,5,6]。
我遇到的麻烦就是找到对角线。 这是我应该返回的数组的JS代码。
var poss = [Number(num+1),Number(num-1),Number(num+col),Number(num-col),Number((num+col) + 1),Number((num+col) - 1),Number((num-col) + 1),Number((num-col) - 1)];
这返回[1,5,6,4]。 我的代码不包括负数。 但是,4不应该存在。 我意识到这是因为这是一个边缘情况,并且它没有注册为越界,因为它不是负数。 是否有某种公式可以找到与其对角连接的元素? 请记住我使用的是1d数组。 该程序也独立于数组大小运行。 因此,这也必须适用于4x4或5x4的电路板。 所以使用row和num字段是理想的。
我似乎已经弄清楚了。 至少,我已经通过了所有测试用例。 我确信这不是最简单,优雅或有效的方式。 可能需要更多测试用例。 我确保它的计算与列数和行数无关。 这是我使用的巨大if语句。
var x = poss[i]
if((Number(num) % col == 0 && Number(num-1) == Number(x)) ||
(Number(num+1) % col == 0 && Number(num+1) == Number(x)) ||
((Number(num) % col == 0 || Number(num+1) % col == 0) && (Number((num-col) -1) == Number(x))) ||
((Number(num) % col == 0 || Number(num+1) % col == 0) && (Number((num+col) -1) == Number(x))) ||
((Number(num) % col == 0 || Number(num+1) % col == 0) && (Number((num-col) +1) == Number(x))) ||
((Number(num) % col == 0 || Number(num+1) % col == 0) && (Number((num+col) +1) == Number(x))))
{//exclude number from results}
变量num是您当前正在搜索邻居的阵列上的数字。 变量x是可能的邻居之一。
随意发表另一个想法。
这是我对这个问题的解决方案,它应该易于阅读和理解,我也添加了一些评论。
var cols = 5;
var rows = 5;
function connectedPoints(point) {
var connectedPoints = [];
// First test if the point is on an edge
var topEdge = point/cols < 1;
var leftEdge = point%cols == 0;
var rightEdge = point%cols == cols-1;
var bottomEdge = point/cols >= rows-1;
// Add points that are above the point
if (!topEdge) {
if (!leftEdge) {
connectedPoints.push(returnIfNotNegative(point-cols-1));
}
connectedPoints.push(returnIfNotNegative(point-cols));
if (!rightEdge) {
connectedPoints.push(returnIfNotNegative(point-cols+1));
}
}
// Add points that are to the left or right of the point
if (!leftEdge) {
connectedPoints.push(returnIfNotNegative(point-1));
}
if (!rightEdge) {
connectedPoints.push(returnIfNotNegative(point+1));
}
// Add points that are below the point
if (!bottomEdge) {
if (!leftEdge) {
connectedPoints.push(returnIfNotNegative(point+cols-1));
}
connectedPoints.push(returnIfNotNegative(point+cols));
if (!rightEdge) {
connectedPoints.push(returnIfNotNegative(point+cols+1));
}
}
console.log(connectedPoints);
}
function returnIfNotNegative(point) {
if (point < 0) {
return null;
}
return point;
}
connectedPoints(0);
您可以尝试使用position而不是value。 这将简化事情。
您可以使用另一个函数来获取值的位置。
var arr = [ [00, 01, 02, 03, 04], [05, 06, 07, 08, 09], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24] ] function getNeighbours(x, y) { var result = []; for (var i = x - 1; i <= x + 1; i++) { for (var j = y - 1; j <= y + 1; j++) { if (arr[i] && arr[i][j]) { if (!(x === i && y === j)) result.push(arr[i][j]); } } } return result; } console.log(getNeighbours(0, 0)); console.log(getNeighbours(3, 3));
使用数组时,尽可能多地在内循环外移动计算很重要。 我的方法是在每一行中找到左列的起始位置,然后迭代列范围。
var arr = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 ] function getNeighbours(col, row) { var w = 5; var start = (row > 0 ? row * w - w : row * w) + (col > 0 ? col - 1 : col); var rowSpan = ((row > 0 ? 2 : 1) + (row < (w - 1) ? 1 : 0)) * w; var colSpan = (col > 0 ? 2 : 1) + (col < (w -1) ? 1 : 0); var center = col + row * w; var result = []; for (var r = start; r < start + rowSpan; r += w) for (var i = r; i < r + colSpan; i++) if (!(i === center)) result.push(arr[i]); return result; } console.log(getNeighbours(0,0)); console.log(getNeighbours(3,3)); console.log(getNeighbours(3,4)); console.log(getNeighbours(4,3)); console.log(getNeighbours(4,4)); /* [1, 5, 6] [12, 13, 14, 17, 19, 22, 23, 24] [17, 18, 19, 22, 24] [13, 14, 18, 23, 24] [18, 19, 23] */
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.