【问题标题】:Peg solitare recursion solutionPeg纸牌递归解决方案
【发布时间】:2015-06-26 18:04:56
【问题描述】:

每个人都知道饼干桶三角钉接龙游戏。您拿起一个钉子并将其跳过另一个钉子进入一个空洞,目标是只剩下一个钉子。

在我的游戏板对象代码中,我有一个函数sCpeg(int a, int b),它改变了你当前用来跳跃的钉子。为了解决它,我将它连接到 moves 变量。每次您更改当前的钉子并使用它来跳跃时,这都算作一次移动。它是作为我希望成为搜索算法的一个非常基本的启发式完成的:探索一个钉子可用的所有可能的跳跃。如果未找到回溯解决方案,请更新当前挂钩并重复该过程。

当我写出这个想法时,这听起来像是一个使用递归的完美示例,但我不知道如何在这种情况下正确使用递归。在回溯和更新当前挂钩之间,我迷路了。

所有这些听起来都太复杂了吗?我是否应该删除移动和sCpeg() 选项并让搜索算法随机跳转直到找到解决方案?

递归是解决这个难题的好方法吗?我的跳转功能目前仅通过询问您想要跳转到的位置来工作。我必须更改它以获取每次跳跃所需的开始和结束位置,这很容易更改,但我不知道它对算法来说是好还是坏。

这是一个学校项目,所以我必须实现一个不知情的搜索和一个启发式搜索算法。更改我的 jump() 函数可能会影响我的启发式方法。

我正在使用 Java 进行编码,但由于这有点模糊,我只期待伪代码的答案。仅伪代码就足以让我走上正轨。 .

【问题讨论】:

    标签: algorithm search recursion


    【解决方案1】:

    这是递归解决方案的框架:

    // given a board description, outputs solution sequence string, or null if no soln
    public String sCpeg(boardDescription bd)
      if bd is solution state, return "" // termination of successful recursion
      for each possible move m
        calculate result of m on bd to obtain newbd
        store result of sCpeg(newbd) in subresult
        if subresult is not null, return m + subresult
      end for
      // if we're here, no move worked -- termination, unsuccessful
      return null
    

    我想这就是它的全部。

    这类问题还有另一个框架:图论。图的节点是棋盘状态。如果你能从另一个得到一个,我们用箭头连接两个棋盘状态。然后在连接开始到结束的图中搜索最短路径...使用有向图算法中的任何标准最短路径。

    但是您的递归想法应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 2015-10-25
      • 1970-01-01
      • 2021-11-03
      • 2018-12-30
      相关资源
      最近更新 更多