我有一个数组 - 2D(在这种情况下为 100 x 100),一些状态限制在边界内,如图所示: http ://tinypic.com/view.php?pic=mimiw5&s=5#.UkK8WIamiBI
每个单元格都有自己的 id(颜色,例如绿色是 id=1)和标志 isBorder(如果为真,则在图片上标记为白色)。我正在尝试做的是排除一组具有边界限制的状态的单元格(谷物),这样我就可以分别处理每个谷物,这意味着我需要存储每个谷物的所有索引。
任何人都知道如何解决它?
我有一个数组 - 2D(在这种情况下为 100 x 100),一些状态限制在边界内,如图所示: http ://tinypic.com/view.php?pic=mimiw5&s=5#.UkK8WIamiBI
每个单元格都有自己的 id(颜色,例如绿色是 id=1)和标志 isBorder(如果为真,则在图片上标记为白色)。我正在尝试做的是排除一组具有边界限制的状态的单元格(谷物),这样我就可以分别处理每个谷物,这意味着我需要存储每个谷物的所有索引。
任何人都知道如何解决它?
现在我再次阅读了您的问题......该算法与用颜色填充连续区域基本相同。最常见的方法是 BFS 算法。
只需从您确定位于当前区域内的某个点开始,然后逐渐向各个方向移动,选择遍历的字段并将它们放入vector
.
// 编辑:在我理解问题之前提出的一系列其他见解。
我可以想象一个算法是这样工作的:
vector<2dCoord> result = data.filter(DataType::Green);
for (2dCoord in result) {
// do some operations on data[2dCoord]
}
以简单的未优化方式的实现filter
是扫描整个数组并将push_back
字段匹配到向量。
如果您需要更复杂的查询,延迟评估的代理对象可以创造奇迹:
data.filter(DataType::Green)
.filter_having_neighbours(DataType::Red)
.closest(/*first*/ 100, /*from*/ 2dCoord(x,y))
.apply([](DataField& field) {
// processing here
});