【问题标题】:Check the diagonal neighbors of a node检查节点的对角邻居
【发布时间】:2016-03-30 17:59:24
【问题描述】:

我正在尝试比较一个节点的值。使用洪水填充算法,我能够垂直和水平地检查网格的每个节点。现在我必须更新我的代码以检查位于对角线上的单元格,如下图所示:

红色表示当前节点,黄色表示需要检查的单元格。

这是我目前所拥有的sn-p:

var mapWidth = Math.sqrt(mapData.length);
var currentCell = $('[data-x="'+ x +'"][data-y="'+ y +'"]');
if (x < 0 || y < 0 || x > mapWidth || y > mapWidth) {
    return;
}
if(mapData[x*mapWidth+y] !== 0 || currentCell.hasClass('cell-grey')) {
    if(mapData[x*mapWidth+y] > 0) {
        currentCell.addClass('cell-grey').css('opacity', '1');
    }
    if(mapData[(x-1)*mapWidth+(y-1)] > 0 && mapData[(x-1)*mapWidth+(y-1)] < mapWidth) {
        currentCell.addClass('cell-grey').css('opacity', '1');
        return;
    }
    if(mapData[(x-1)*mapWidth+(y+1)] > 0 && mapData[(x-1)*mapWidth+(y+1)] < mapWidth) {
        currentCell.addClass('cell-grey').css('opacity', '1');
        return;
    }
    if(mapData[(x+1)*mapWidth+(y-1)] > 0 && mapData[(x+1)*mapWidth+(y-1)] < mapWidth) {
        currentCell.addClass('cell-grey').css('opacity', '1');
        return;
    }
    if(mapData[(x+1)*mapWidth+(y+1)] > 0 && mapData[(x+1)*mapWidth+(y+1)] < mapWidth) {
        currentCell.addClass('cell-grey').css('opacity', '1');
        return;
    }
    return true;
}

mapWidth是包含网格所有单元格的变量,currentCell是当前节点单元格。这个 sn-p 真的不适合我。

【问题讨论】:

  • 如果您有适用于横向移动的代码,那么没有理由在最小更新后它不适用于对角线移动。我们可以看到其他代码吗?
  • “没有真正工作”没有提供信息。可以多说吗?
  • 没有真正工作,我的意思是对角线邻居没有检查

标签: javascript algorithm multidimensional-array cells


【解决方案1】:

当您评估mapData[(x-1)*mapWidth+(y-1)] 时,x-1y-1 的值可能会导致越界引用,这会返回undefined。您必须在访问数组之前验证单元格坐标。

您可以像这样遍历四个对角线邻居:

for (var neighborX = x - 1; neighborX <= x + 1; neighborX += 2) { 
    if (neighborX < 0 || neighborX >= mapWidth) { 
        continue;
    }
    for (var neighborY = y - 1; neighborY <= y + 1; neighborY += 2) { 
        if (neighborY < 0 || neighborY >= mapWidth) { 
            continue;
        } 
        currentCell.addClass('cell-grey').css('opacity', '1');
    } 
}

我不确定您要完成什么,但您的代码中似乎还有其他错误。例如,您可能不想在将单元格变为灰色后立即return。如果您希望每个对角线邻居都变成灰色,那么上面的循环应该可以解决问题。

代码开头附近的这一行包含一个细微的错误:

if (x < 0 || y < 0 || x > mapWidth || y > mapWidth) {

有效索引范围从0mapWidth - 1,所以你应该写:

if (x < 0 || y < 0 || x >= mapWidth || y >= mapWidth) {

【讨论】:

  • 谢谢@MichaelLaszlo,我理解迭代,但请您解释一下,为什么neighborXneighborY 应该小于零?
  • 它们应该小于零。因此,continue 语句跳过了循环体的其余部分。
猜你喜欢
  • 2019-01-27
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多