【问题标题】:Discover that a filled-in grid has a circle; fill in the area发现一个填充的网格有一个圆圈;填写区域
【发布时间】:2017-03-31 21:44:46
【问题描述】:

您好,我目前正在进行一个项目,其中每个时间步都会将一个新网格添加到网格上的一系列块中。我如何能够检测到网格中已经形成了一个圆圈?鉴于我所拥有的只是坐标 (x,y) 和每个单元格的颜色。 “圆圈”是指一个被封闭的区域,如图所示。

提前致谢!顺便说一句,我不是在问如何点击一个单元格并应用洪水填充算法。

算法的后果应该是这样的:

【问题讨论】:

    标签: loops colors grid geometry detect


    【解决方案1】:

    您需要将所有白色(未填充)方格拆分为彼此相邻的方格组。从任何白色方块开始,将其所有未填充的相邻方块添加到集合中,并继续这样做,直到包含所有方块。

    一旦你有了这些集合,如果有不包含任何边界方块的非空集合,你就会有一个“圆”(正如你命名的那样)。然后要填充这些集合,您只需将每个成员的颜色更改为蓝色。

    如果你有上一步的集合,当你添加另一个砖块时,你只需要考虑包含受影响方块的集合,看看它是否被分成了两个集合,以及这些新集合中的任何一个是否可能是“圆圈”。

    【讨论】:

    • 感谢您的回复。我想知道,你怎么知道哪一组白色单元格是你变成蓝色的那组?这就是我认为您的指示要执行的操作: 1)创建一个集合。 2) 向集合中添加一个白色单元格,以及与其相邻的白色单元格,以此类推。但是现在,一旦我有多组白色方块,我怎么知道哪个是被包围的?
    • 有一个 X 到 Y 的数字数组,表示每个正方形所属的集合的编号。您甚至可能不需要以这种方式拥有实际的 Set 结构。然后,如果改变 (x,y) 方格,只需在数组中查找设置的数字即可。
    • 好的,我想我现在明白了。如果你有多组白色方块,你填写的那组就是没有任何边框的那组。
    • 比如说,在你的第一张图片中,“圆圈”之外的所有白色方块都将编号为 1,而圆圈内的所有白色方块都将分配给它们 2。由于没有一个边界正方形有数字 2,所以集合 2 是一个圆。如果将另一个蓝色方块添加到属于第 1 组的点,则需要查看第 1 组是否已分成两组,并查看第 1 组或两个新组中的任何一个是否是“圆”。如果没有拆分,只有当新的蓝色方块是边框方块时,set 1 才能变成一个“圆”。
    • 非常感谢,我终于让它工作了。我有它,以便它在外部集合中找到单元格,然后填充不在外部集合中的所有白色单元格。但是,每次我创建一个新的外部场景时,如果网格超过 50x50,就会非常费力,所以我的下一个问题将是找到一种有效创建外部场景的方法。
    猜你喜欢
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    相关资源
    最近更新 更多