我必须找出一种算法,它可以找到Connect the Walls游戏的解决方案。
在连接墙中,我们将矩形板分成相等的方形单元。在每个单元格中,我们可以放置对角线墙(从左上角到右下角或从左下角到右上角)。我们必须按照以下规则在所有空白处放置墙壁:
- 每个单元格必须包含墙
- 墙不能形成闭环(我们不能“砖砌”)
- 连接支柱的墙壁数量必须与写入的数量相匹配 在柱子上
- 另外一些细胞可能包含一堵我们无法移动的墙壁。
醇>
请帮忙。
编辑:
确定。我已经设法在C中编写简化算法。我需要有人来检查我。它现在可以这样工作:Steps
此外,我对最后一个蛮力步骤有疑问。 我可以选择一个随机单元格开始吗? (也许有更快的方式) 我理解的蛮力算法:
- 选择第一个单元格并将其标记为/或\
- 检查是否符合支柱标准以及是否没有周期
- 如果一切正常,请转到空的邻居单元格,如果没有备份的话 在前一个单元格中更改墙壁方向 (如果我们之前没有这样做的话)
- 循环,直到我们的电路板上没有空单元格。是吗?
醇>
还有一个关于快速循环检查的问题。 我已经发现我可以使用不相交的集合和图形功能的连接组件。 所以...我们在find-union结构中保持图的连通组件。 如果最近添加的新边(墙)连接来自同一个连接组件的点 - 它就是一个循环。
答案 0 :(得分:1)
有趣的游戏。有点像扫雷人。
您是否只想获得解决方案?在这种情况下,它是一个简单的树搜索。有点像解决迷宫。回溯和东西。由于限制非常严格,因此很容易修剪子树。
快速的方法?寻找边界上的所有“2”柱子。首先填写所有内容。也填补角落的“1”柱子。将连接到“0”支柱的所有墙标记为不可能,但标记所有其他方向(因为必须标记所有这些方格)。
然后,对于每个具有墙壁数量的支柱,将所有其他连接墙标记为不可能,标记所有其他方向。然后用一个不可能的墙标记连接到“3”柱子的所有其他墙壁。标记所有其他墙壁连接到“2”支柱与两个不可能的墙壁。然后是“1”支柱。循环。
在简化了这样的电路板之后,你将不得不在剩下的未指定的墙上进行普通的树搜索。标记一个潜在的墙,然后再次循环上面以消除可能性。