每个人都知道饼干桶三角peg solitare游戏。你拿一个钉子将它跳到一个空洞中,目标是只留下一个钉子。
在我的游戏板对象代码中,我有一个函数sCpeg(int a, int b)
,用于更改当前用于跳转的挂钩。为了解决这个问题,我将它连接到moves
变量。每次更改当前的挂钩并将其用于跳跃都算作移动。它是我希望成为搜索算法的一种非常基本的启发式方法:使用一个挂钩探索所有可能的跳转;如果找不到回溯的解决方案,请更新当前的挂钩并重复该过程。
当我写这个想法时,它听起来像是一个使用递归的完美例子,除了我不知道如何在这种情况下正确使用递归。在回溯和更新当前挂钩之间,我迷失了。
所有这些听起来都太复杂了吗?我应该删除移动和sCpeg()
选项并让搜索算法随机跳转直到找到解决方案吗?
递归是解决这个难题的好方法吗?我的跳转功能目前仅通过询问您想要跳转到的位置来工作。我必须改变它以获取每次跳跃所需的开始和结束位置。这很容易改变,但我不知道算法的好坏。
请记住,这是针对学校项目的,因此我必须实施不知情的搜索和启发式搜索算法。更改我的jump()
函数可能会影响我的启发式。
我知道我有点模糊,我只期待伪代码答案。单独的伪代码就足以让我走上正轨。如果有所作为,我用Java编码。
答案 0 :(得分: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
我认为这就是它的全部内容。
还存在这类问题的另一个框架:图论。图表的节点是板状态。如果你能从另一个中获得一个,我们用箭头连接两个板状态。然后搜索连接开始到结束的图中的最短路径...使用有向图算法中的任何标准最短路径。
但是你的递归想法应该可以正常工作。