![]() |
1
6
下面是一种不使用递归的泛洪填充算法。 从每个正方形设置为白色(空白)或黑色(填充)开始。问题是“黑色区域是否相邻?” 您可以使用此算法:
更新:回复,您的评论: 不 使用我在这里草拟的解决方案。请注意,该算法基本上是“改变数据结构以了解有关它的事实”。那不是一件很危险的事。LINQ是关于查询数据结构的 修改它们。 如果我想对你的问题提出一个更像LINQ的解决方案,那么我会采取完全不同的方法。我会这么做。 首先,你知道什么是“等价类”或“等价关系”吗?如果你不知道的话,我会简单地给他们下定义。A 是一个接受两件事并返回布尔值的函数。例如,“小于”、“等于”、“以十为底的最后一位相同”和“和为偶数”都是整数的关系。安 等价 关系(A~B)是 自反的 (X~X总是正确的), 对称的 (X~Y和Y~X是一样的)和 传递的 (如果X~Y和Y~Z都是真的,那么X~Z也是真的)。
等价关系将集合划分为等价类。例如,等价关系“和为偶数”将整数划分为两个等价类:偶数和奇数。选取任意两个奇数,X~Y为真。选择任意两个偶数,X~Y为真。但是一个奇数和一个偶数,X~Y是假的。就这种关系而言,所有偶数都是“等价的”。 现在考虑一个图块集的关系“是这个图块集上的邻居”。显然,这不是一个等价关系;它是对称的,但不是自反的或传递的。但任何关系都可能 扩展 自反与传递闭包 关系的一部分。这是“可从”关系。
因此,描述你的问题的另一种方法是“假设至少有一个黑瓦片,那么整个黑瓦片集合是否与任意瓦片上的相邻关系的自反和传递闭包相同?”如果答案是“是”,那么就有一个单一的连续区域。如果“否”,则必须存在无法到达的区域。
基本上这种方法是“给我一个瓷砖,给我所有与它有邻居关系的瓷砖”。如果您可以计算出哪些成员与给定的成员有关系,那么这种方法非常有效,很明显,在本例中,您可以便宜地进行计算。 现在您可以使用我在这里发布的代码计算该关系的传递闭包和自反闭包: http://blogs.msdn.com/b/ericlippert/archive/2010/02/08/making-the-code-read-like-the-spec.aspx 现在整个算法变得非常简短:
注意,我给出的两个解决方案(以及Albin的草图)是 . 在我的第二个解决方案中,第一个解决方案的“红瓷砖”是“stack”数据结构中的瓷砖,“蓝瓷砖”是我给出的链接中代码的“closure”数据结构中的瓷砖。 解决方案之间的区别只在于你如何 认为 关于解决方案。我喜欢数学思考,所以我更喜欢第二种解决方案。都是关于集合、关系和闭包,非常抽象的概念。如果你更像是一个视觉思考者,那么我的第一个解决方案,你可以想象一个红边波扩散到一个黑色区域,直到它充满,可能更容易理解和推理。 |
![]() |
2
0
你从一个随机的“真”开始。然后你一次“走”一个北,一个南,一个东,一个西。如果您发现一个“true”位不是“visited”,则在一个单独的结构中将该节点标记为“visited”,并从此处向所有方向递归“walk”。如果位为“假”或“已访问”,则不执行任何操作并返回到上一个“级别”。当您找不到更多的非“已访问”节点时,请计算已访问节点的数量,并与“真实”节点的总数进行比较。 编辑: |
![]() |
user2257918 · 为什么此代码不创建棋盘格图案? 7 年前 |
![]() |
Ally · 在位图上绘制长字符串会导致绘图问题 7 年前 |
![]() |
Melih · 谷歌移动视觉低图像质量 7 年前 |
![]() |
Dhruv Chadha · OpenGL图像未映射到坐标 7 年前 |