我将我的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字段是理想的。
答案 0 :(得分:1)
我似乎已经弄明白了。至少,我已经通过了所有测试用例。我确信这不是最简单,优雅或有效的方式。可能需要更多测试用例。我确保它的计算与列数和行数无关。这是我使用的巨大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是可能的邻居之一。
随意发表另一个想法。
答案 1 :(得分:1)
这是我对这个问题的解决方案,它应该易于阅读和理解,我也在其中添加了一些评论。
jonstark@jonstark-pc:~/rails_projects$ rails -v
Rails 4.0.3
答案 2 :(得分:1)
您可以尝试使用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));
&#13;
答案 3 :(得分:1)
使用数组时,尽可能多地在内循环外移动计算很重要。我的方法是在每一行中找到左列的起始位置,然后迭代列范围。
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]
*/