我怀疑没有多项式时间算法可以保证解决这个问题的每一个实例。但是由于要求每个正方形都必须被管道覆盖,因此类似于人类和计算机用于解决数独的方法在这里应该很有效:
1. 对于每个空白正方形,形成该正方形可能颜色的集合,然后在每个正方形上重复执行逻辑推断,以缩小该正方形允许的颜色集。
2. 每当正方形的可能颜色集缩小到大小为1时,该正方形的颜色就确定了。
3. 如果我们达到了一个状态,在这个状态中不能再进行逻辑推断,并且谜题还没有完全解决(即至少有一个正方形具有多个可能的颜色),则选择其中一个未决定的正方形并对其进行递归,依次尝试每种可能的颜色。每次尝试将导致解决方案或矛盾;后者会消除该颜色作为该正方形可能性。
在选择分支正方形时,通常最好选择允许颜色最少的正方形。
[编辑:避免形成无效的“管道回路”非常重要。一种方法是为每个正方形x的每个允许颜色i维护2位信息:正方形x是否通过一条明确的i-颜色瓷砖路径与第一个i-颜色端点连接,以及同样的内容适用于第二个i-颜色端点。然后在进行递归时,不要选择具有两个相同位设置(或没有位设置)的邻居的正方形,对于任何允许的颜色。]
实际上,您根本不需要使用任何逻辑推断,但是您使用的推断越多且越好,程序运行得越快,因为它们将(可能显着)减少递归量。一些有用的推断包括:
1. 如果某个正方形是扩展某个特定颜色路径的唯一可能方法,则必须分配该颜色。
2. 如果某个正方形在其允许的颜色集中具有颜色i,但它没有至少有2个相邻正方形也在其允许的颜色集中具有颜色i,则它无法被任何i颜色的路径“到达”,并且可以消除颜色i作为可能性。
基于路径连通性的更高级别的推断可能会进一步帮助 - 例如,如果您可以确定连接某对连接器的每条路径都必须通过特定的正方形,则可以立即将该颜色分配给该正方形。
这种简单的方法在您的5x5示例中推断出完整的解决方案,而无需任何递归:位于(5,2)、(5,3)、(4,3)和(4,4)的正方形被迫变为橙色;(4,5)被迫变成绿色;由于没有其他颜色能够到达这个方块然后再返回来,(5,5)也被迫变成绿色。现在,以(4,4)结束的橙色路径除了完成(3,4)处的橙色路径之外,别无选择。此外,(3,1)被迫变成红色;(3,2)被迫变成黄色,进而迫使(2,1)和(2,2)变成红色,最终迫使黄色路径在(3,3)处完成。在(2,2)处的红色管道迫使(1,2)变成蓝色,红色和蓝色路径最终被完全确定,“相互迫使”。