【问题标题】:Is there an algorithm to explore all cells in a grid, excluding redundant cells?是否有一种算法可以探索网格中的所有单元格,不包括冗余单元格?
【发布时间】:2019-07-15 04:40:23
【问题描述】:

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

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

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

【问题讨论】:

  • 网格中有障碍物吗?
  • 起始位置是否总是让你看到一个角落?

标签: algorithm


【解决方案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 是您将在上面的 for 循环中访问的单元格

...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/

【讨论】:

  • 哇,这让我更了解它了。现在对于高级场景,如果一个单元格被阻塞并且无法访问怎么办?我们该如何处理?
  • 可能会检查 everyCell,类似于 visitIfCell(i,j) 当且仅当 cell(i,j) 未被阻止时才会调用 visitCell。替代方法可能是将要访问的单元格构建为列表,并从该列表中删除被阻止的单元格。我会使用前一个,因为迭代和检查阻塞的单元格可能不是瓶颈
猜你喜欢
  • 1970-01-01
  • 2018-12-20
  • 2020-09-13
  • 2020-07-27
  • 2015-06-06
  • 2019-10-08
  • 2023-04-10
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多