所以我用C ++编写了这个谜题,但现在我需要找到一种方法让计算机解决它。根据我的理解,我必须让计算机将这个难题的所有状态生成图形,然后让计算机使用BFS来找到已解决的状态?如何计算拼图有多少个顶点和边?我正在谈论的难题是“Cracker Barrel Triangle Game”。如何解决这个坏孩子,我们将不胜感激。
抱歉,我没有提到拼图是如何运作的。所以给你一个带有14个钉子和15个位置的三角形,看起来类似于:
*
2 3
4 5 6
7 8 9 A
B C D E F
其中*是空格。现在,有点像跳棋,你只能在另一个钉子上跳到空的空间,所以这里只有两个有效的移动,4比1,或者6比1,中间的钉被移除,导致这个: / p>
1
2 *
4 5 *
7 8 9 A
B C D E F
跳钉6到1后
您继续这样做,直到主板上只留下一个挂钩。
答案 0 :(得分:2)
以下是像这样的状态空间搜索问题的标准方法:
创建一个可以生成下一个可能状态的函数: 此功能需要能够接收表示电路板的某种信息,并返回可能产生的移动列表(或由它们产生的电路板)。例如,您可以迭代每个挂钩,计算给定挂钩可以进行的移动,并将它们附加到列表中,直到您检查完所有挂钩为止。
使用BFS生成/搜索图表 将当前节点初始化为开始状态,然后启动广度优先搜索。对于每个节点,计算下一个可能的状态,并将它们添加到搜索队列的末尾。保留您已添加到队列中的每个州的字典(因为它比列表更有效)。如果生成字典中的一个,则丢弃它而不是编辑它。最终,您将获得一个只有1个挂钩的电路板,此时您的搜索将会成功。
这是使用广度优先搜索解决拼图的标准方法。您不需要事先知道有多少个顶点和边缘,因为您的代码将生成图形。请注意,它不会自动生成状态空间的完整图表。为此,您需要在每次遇到重复的电路板状态时添加边缘。