C 围棋中清除棋盘的快速算法

C 围棋中清除棋盘的快速算法,c,baduk,C,Baduk,我目前正在写一些代码来处理围棋板。围棋板表示为一组颜色。该数组具有大小×大小项,表示二维方形板 enum color { EMPTY, BLACK, WHITE, }; struct go_board { unsigned int size; enum color intersections[]; }; 当enum color player移动时,以下步骤适用:(请参阅) [……] 如果P的颜色的相邻点(垂直或水平)有一条从P到颜色C的点的路径,则称点

我目前正在写一些代码来处理围棋板。围棋板表示为一组颜色。该数组具有
大小
×
大小
项,表示二维方形板

enum color {
    EMPTY,
    BLACK,
    WHITE,
};

struct go_board {
    unsigned int size;
    enum color intersections[];
};
enum color player
移动时,以下步骤适用:(请参阅)

  • [……]
  • 如果P的颜色的相邻点(垂直或水平)有一条从P到颜色C的点的路径,则称点P(非彩色C)到达C
  • 清除颜色是清空该颜色中所有未达到空值的点的过程
  • [……]
  • 招式包括[…]清除对手的颜色,然后清除自己的颜色

  • 我正在寻找一个快速(在没有计算复杂度和实际速度方面)算法来清除一块板。你能帮我吗?

    使用图像处理的洪水填充算法。首先,用空点播种并填充所有白色或空的位置;所有未填充白色石头的位置都将死亡。用黑色重复。

    你可以在黑板上记录每个小组的参考资料,并记录他们的自由。对于每个添加的石头,您最多只需合并/更新4个组。是我还是这听起来很好


    (已编辑)

    您是否衡量过您的“慢”方法并确定它是应用程序中的瓶颈?第一:使其正确工作;不要担心性能。@pmg我想到的“慢”方法太难看了,我还没有测试过它。计算复杂度是O(nˆ4),其中n是电路板的大小。@pmg我感兴趣的是如何有效地解决它,而不仅仅是如何解决它。如果仅仅解决一个问题就足够了,我们可以一直使用StuoGeSoRT……@ PMG也考虑一个AI。它必须在每一步行动后清理董事会。清理棋盘可能是一个瓶颈。我欢迎巴杜克标签:)但它可能是围棋或围棋(因为游戏可能起源于中国)。。。不管怎样,比“go”更不含糊。这看起来像一个O(n²)算法,看起来很不错。我要看看这个。非常感谢。这可能行得通,但我不得不承认我不确定自己是否理解。而且它可能不起作用:在Go中,一些组是无条件存活的(2只或更多的眼睛,或者相互关联的组之间有几个假眼睛),另一些组是“相互依赖”存活的(seki,…)。我不确定这是否可以简单地放回到一个简单的填充算法中。@Olivier我只是问一些应该被删除的组,因为它们没有剩余的自由。在我的用例中不需要更多的计算。这对我有什么帮助?围棋板不是很稀疏。事实上,我回答得太快了,或者让我编辑我的答案。