确定矩阵中的循环

时间:2013-01-10 18:31:16

标签: algorithm matrix cycle

我有一个矩阵,每个单元格都有一个布尔属性。我需要确定一个循环,从具有布尔属性false的单元格开始,并且此循环必须仅包含将该布尔属性设置为true的单元格(显然除了起始单元格)。另一个条件是循环中的任何两个连续单元必须位于同一行(或同一列),并且循环中的三个连续单元不能位于同一行(或同一列)。 你实际上可以从一个单元格跳转到另一个单元格,它们不必是邻居,它们只需要在同一行或列上。 谢谢。

1 个答案:

答案 0 :(得分:0)

更新:我错过了不需要在两个相邻单元格之间移动 - 这会增加每一步可能的移动次数,但并不能真正改变一般的想法。

最简单的实现可能是depth-first search - 你从起始单元开始并查看所有可能的移动 - 除了第一步之外最多有三个可能的移动。对于每个可能的移动,您将以递归方式执行相同操作,直到再次到达起始单元格或者没有可能的移动为止。在后一种情况下,如果剩下一个移动,你会追踪一个移动并尝试下一个可能性。

您必须将最后一次移动的方向与递归调用一起传递,因为此方向对于下一次移动无效。如果不允许多次访问单元格,则必须跟踪访问的单元格,并在追溯时取消标记它们。如果允许多次访问单元格,则必须在访问单元格之前跟踪单元格的方向,以避免循环。

使用breath-first search而不是深度优先搜索将避免尝试长路径,这些路径不是解决方案,而是以保留大量部分解决方案为代价。 A* search可能是提高速度的另一种选择。

附注:可能是多次访问单元格没有价值,因为您可能在第一次访问单元格时直接进行另一次移动。第一次进入单元格时不允许进行移动 但我不确定这条道路是否可行。