连接墙算法

时间:2011-03-30 10:12:32

标签: algorithm

我必须找出一种算法,它可以找到Connect the Walls游戏的解决方案。

在连接墙中,我们将矩形板分成相等的方形单元。在每个单元格中,我们可以放置对角线墙(从左上角到右下角或从左下角到右上角)。我们必须按照以下规则在所有空白处放置墙壁:

  
      
  1. 每个单元格必须包含墙
  2.   
  3. 墙不能形成闭环(我们不能“砖砌”)
  4.   
  5. 连接支柱的墙壁数量必须与写入的数量相匹配   在柱子上
  6.   
  7. 另外一些细胞可能包含一堵我们无法移动的墙壁。
  8.   

Connect the walls online game

请帮忙。

编辑:

确定。我已经设法在C中编写简化算法。我需要有人来检查我。它现在可以这样工作:Steps

此外,我对最后一个蛮力步骤有疑问。 我可以选择一个随机单元格开始吗? (也许有更快的方式) 我理解的蛮力算法:

  
      
  1. 选择第一个单元格并将其标记为/或\
  2.   
  3. 检查是否符合支柱标准以及是否没有周期
  4.   
  5. 如果一切正常,请转到空的邻居单元格,如果没有备份的话   在前一个单元格中更改墙壁方向   (如果我们之前没有这样做的话)
  6.   
  7. 循环,直到我们的电路板上没有空单元格。是吗?
  8.   

还有一个关于快速循环检查的问题。 我已经发现我可以使用不相交的集合和图形功能的连接组件。 所以...我们在find-union结构中保持图的连通组件。 如果最近添加的新边(墙)连接来自同一个连接组件的点 - 它就是一个循环。

1 个答案:

答案 0 :(得分:1)

有趣的游戏。有点像扫雷人。

您是否只想获得解决方案?在这种情况下,它是一个简单的树搜索。有点像解决迷宫。回溯和东西。由于限制非常严格,因此很容易修剪子树。

快速的方法?寻找边界上的所有“2”柱子。首先填写所有内容。也填补角落的“1”柱子。将连接到“0”支柱的所有墙标记为不可能,但标记所有其他方向(因为必须标记所有这些方格)。

然后,对于每个具有墙壁数量的支柱,将所有其他连接墙标记为不可能,标记所有其他方向。然后用一个不可能的墙标记连接到“3”柱子的所有其他墙壁。标记所有其他墙壁连接到“2”支柱与两个​​不可能的墙壁。然后是“1”支柱。循环。

在简化了这样的电路板之后,你将不得不在剩下的未指定的墙上进行普通的树搜索。标记一个潜在的墙,然后再次循环上面以消除可能性。