是否有一种算法可以探索网格中的所有单元(不包括冗余单元)?

时间:2019-07-14 13:53:20

标签: algorithm

我正在寻找一种算法,该算法可以探索整个网格(不包括相邻单元格)。

enter image description here

图片显示我所在的位置是绿色的斑点,我看到的是蓝色的斑点。现在,我想访问网格上的每个单元(“看到”每个单元)。这意味着我想移动的方式是不必移动到每个单元格,而跳过相邻的单元格。

是否有类似算法的名称,或者在这里可以推荐什么?请注意,网格可以是任意大小,任意数量的单元格,约束条件保持不变:我总是可以“看到”相邻的单元格。

1 个答案:

答案 0 :(得分:1)

我猜最接近的术语是填充/跨距? 在您的情况下,请踩1并大步3。

for(var i  = 1; i<n; i+=3){
    for(var j = 1; j<m; j+=3){
        //visit your cell
    }
}

如果您没有3行/列的倍数,则可能会出现问题。

当您向右迭代时,请考虑各种情况(网格宽度不同)。 x是一个单元格。 O是一个您将在上面循环访问的单元格

...xxxxxx
...xOxxOx <-- ok you can see everything
...xxxxxx

...xxxxx
...xOxxO  <-- ok you can see everything
...xxxxx

...xxxx 
...xOxxF   <-- ko you are out of bounds and should have taken the "first" column
...xxxx 

当grid.width%3 = 1时出现ko情况

所以您可以单独处理

for(var i  = 1; i<n; i+=3){
    for(var j = 1; j<m; j+=3){
        //visitCell(i,j)
    }
}
if(n%3 == 1){
    for(var j = 1; j<m; j+=3){
        visitCell(n-1,j);
    }
}

if(m%3 == 1){
    for(var i = 1; i<n; i+=3){
        visitCell(i,m-1);
    }
}

if(m%3 == 1 && n%3 == 1){
    visitCell(n-1,m-1);
}

提琴:https://jsfiddle.net/khvsz4fx/