检测网格中的节点序列


12

鉴于下图,我需要检测板上的最佳序列(绿线)。蓝/红线表示可能的动作,但不是最佳动作。

规则如下:

  1. 您可以移动到与您的邻居相同且相同的任何图块(对角线有效)
  2. 一旦您访问了图块,便无法再次访问它。

我已经考虑过遍历每个节点,并查看其邻居,然后递归地遍历。一旦找到可行的动作,就可以将其放入结构中。一旦找到所有可能的移动,我就选择节点数最高的移动。当一个节点具有多个匹配的邻居时,将变得更加困难。

那么,我可以使用某些算法吗?我当时在想某种洪水填充,但这不符合规则2。

根据要求,以下是类似游戏视频。http://youtube.com/watch?v=eumnCTG0AE8

在此处输入图片说明


可能需要注意的是,三把剑/金是可能的搭配,但我只是没有在图像中包括它们。

为什么这三把剑/金可能匹配?是否要查找至少包含3个项目的所有路径?
2011年

是的,就是这个想法。

Answers:


6

您可以考虑每组链接的相同符号(通过链接我的意思是您可以从一个符号传播到另一个符号)是一个单独的。对于每个这样的图,从图中的每个节点开始应用深度优先搜索(DFS),该节点尚未成为该图的最长路径的一部分。每次在应用DFS时遇到死胡同时,请检查您遍历的路径是否长于迄今为止找到的全局最大值。如果是这样,请将其存储为新的最长路径。

您会注意到,在上一段中,我提到为每个图形多次应用DFS。在图表上运行单个DFS是不够的。考虑以下特殊情况:

    1
1 1 1
    1
    1
    1
    1

如果偶然您首先在此图的最高节点上运行DFS,则会发现最长的路径为垂直线,但这是不正确的。每当您在结果路径中某处或根本不包含它的节点中启动DFS算法时,就会发生这种情况。在此特定示例中,您还需要从第二行的最左侧节点启动DFS算法。那将找到正确的路径。一般来说,如上所述,您需要在当前不属于该图的最长路径的每个节点中运行DFS算法。

对于该算法,绝对最坏的情况是用单个符号类型填充或大部分填充一个棋盘,但是这不太可能在游戏中发生。另外,请注意如何存储每个图形的最长路径。如果不优化此位,则最好为舞台上的每个节点调用DFS。假设您不使用非常大的电路板,并且速度不是一个大问题,那么该解决方案应该足够快。

从技术上讲,通过将电路板分解为单独的图形,您最终会遇到多个“ 最长路径问题 ”。从示例中我们可以看到,图形中可以包含循环(例如,所有符号都位于同一类型的阶段的外部),这意味着在此特定问题中,您需要找到最长的路径在几个循环无向图中,这是无法在多项式时间内完成的

如果发现它太慢,请参见StackOverflow上的此答案,以获取有关如何优化单个“最长路径问题”的更多详细信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.