我正在创建一个游戏,用户将看到2套彩色瓷砖。为了确保拼图是可以解决的,我从一组开始,将其复制到第二组,然后将拼贴从一组交换到另一组。目前,(这就是我的问题所在)交换的数量取决于用户正在玩的级别 - 1级交换1级,2级交换2级等。相同数量的交换用作目标游戏。用户必须通过将瓷砖从一组交换到另一组来完成拼图,以使2组匹配(按颜色)。只要2组匹配,(用户)解决的拼图中的拼贴顺序无关紧要。
我遇到的问题是,随着我用于生成拼图的交换次数接近每组中的拼贴数量,拼图变得更容易解决。基本上,您可以按照第二组所需的顺序从一组拖动,并通过大量移动解决难题。我想要做的是在完成拼图之后,计算解决拼图所需的最小移动次数。同样,这几乎总是小于用于创建拼图的互换数量,特别是当互换数量接近每组中的拼贴数量时。
我的目标是计算最佳情况,然后给用户一个“软糖因子”(即最小移动次数的1.2倍)。在这个数量的移动下解决难题将导致通过级别。
关于我目前如何配置游戏的一些背景知识:
级别1到10:每组9个瓦片。 5种不同颜色的瓷砖。 级别11到20:每组12个瓦片。 7种不同颜色的瓷砖。 等级21至25:每组15个瓦片。 10种不同颜色的瓷砖。
不允许在一个集合内交换。
对于每个级别,将至少有2个给定颜色的图块(在解决的拼图中每个图块一个)。
是否有任何类型的算法可以推荐人来计算解决给定谜题的最小移动次数?
答案 0 :(得分:6)
解决难题的最小动作基本上是从未解决状态到解决状态的shortest path。你的游戏隐含地定义了一个顶点是合法状态的图形,如果有一个合法的移动可以实现转换,那么两个状态之间就存在边缘。
根据搜索空间的大小,简单的breadth-first search是可行的,并且可以为您提供达到任何给定状态的最少步骤数。实际上,您也可以通过这种方式生成问题:不是通过随机移动来到达状态并检查其与初始状态的“距离”,而只需在广度优先/ level-order中探索搜索空间,为你的谜题选择一个给定“距离”的状态。
IF 搜索空间对于BFS来说太大了(而且我还不确定它是),您可以使用iterative deepening depth-first search代替。像DFS一样节省空间,但像BFS那样(累积式)级别顺序。即使节点被多次访问,它仍然与BFS渐近相同,但需要更多的空间。
答案 1 :(得分:1)
我不太了解你的描述中的谜题,但是在解决这类谜题时常常有用的两个一般性想法是backtracking和branch and bound。
答案 2 :(得分:1)
A* search algorithm。我们的想法是,您可以衡量一个位置与解决方案的接近程度。 A *是一个“最佳第一”搜索,因为它认为在每一步中它都是从目前为止找到的最佳位置移动。您可以根据某种程度衡量您对解决方案的接近程度。 (它不必是准确的,它只是指导搜索的启发式方法。)在实践中,它通常比纯粹的第一次搜索执行得更好,因为它始终由您的贴近度评分函数引导。但是,如果不了解您的问题描述,很难说。 (根据经验,如果在做谜题时有一种“进步”的感觉,而不是在最后突然聚集在一起,那么A *是一个不错的选择。)