您可以考虑每组链接的相同符号(通过链接我的意思是您可以从一个符号传播到另一个符号)是一个单独的图。对于每个这样的图,从图中的每个节点开始应用深度优先搜索(DFS),该节点尚未成为该图的最长路径的一部分。每次在应用DFS时遇到死胡同时,请检查您遍历的路径是否长于迄今为止找到的全局最大值。如果是这样,请将其存储为新的最长路径。
您会注意到,在上一段中,我提到为每个图形多次应用DFS。在图表上运行单个DFS是不够的。考虑以下特殊情况:
1
1 1 1
1
1
1
1
如果偶然您首先在此图的最高节点上运行DFS,则会发现最长的路径为垂直线,但这是不正确的。每当您在结果路径中某处或根本不包含它的节点中启动DFS算法时,就会发生这种情况。在此特定示例中,您还需要从第二行的最左侧节点启动DFS算法。那将找到正确的路径。一般来说,如上所述,您需要在当前不属于该图的最长路径的每个节点中运行DFS算法。
对于该算法,绝对最坏的情况是用单个符号类型填充或大部分填充一个棋盘,但是这不太可能在游戏中发生。另外,请注意如何存储每个图形的最长路径。如果不优化此位,则最好为舞台上的每个节点调用DFS。假设您不使用非常大的电路板,并且速度不是一个大问题,那么该解决方案应该足够快。
从技术上讲,通过将电路板分解为单独的图形,您最终会遇到多个“ 最长路径问题 ”。从示例中我们可以看到,图形中可以包含循环(例如,所有符号都位于同一类型的阶段的外部),这意味着在此特定问题中,您需要找到最长的路径在几个循环无向图中,这是无法在多项式时间内完成的。
如果发现它太慢,请参见StackOverflow上的此答案,以获取有关如何优化单个“最长路径问题”的更多详细信息。