如何使用广度优先搜索来解决难题?

时间:2013-11-24 20:32:44

标签: c++ graph artificial-intelligence puzzle breadth-first-search

几个学期前我上过课,但当时学的不多。我看了麻省理工学院关于广度优先搜索的讲座。我从中学到了很多,但它只告诉我BFS是一个很好的搜索图表的算法,非常棒。我需要解决一个难题。

所以我用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后

您继续这样做,直到主板上只留下一个挂钩。

1 个答案:

答案 0 :(得分:2)

以下是像这样的状态空间搜索问题的标准方法:

创建一个可以生成下一个可能状态的函数: 此功能需要能够接收表示电路板的某种信息,并返回可能产生的移动列表(或由它们产生的电路板)。例如,您可以迭代每个挂钩,计算给定挂钩可以进行的移动,并将它们附加到列表中,直到您检查完所有挂钩为止。

使用BFS生成/搜索图表 将当前节点初始化为开始状态,然后启动广度优先搜索。对于每个节点,计算下一个可能的状态,并将它们添加到搜索队列的末尾。保留您已添加到队列中的每个州的字典(因为它比列表更有效)。如果生成字典中的一个,则丢弃它而不是编辑它。最终,您将获得一个只有1个挂钩的电路板,此时您的搜索将会成功。

这是使用广度优先搜索解决拼图的标准方法。您不需要事先知道有多少个顶点和边缘,因为您的代码将生成图形。请注意,它不会自动生成状态空间的完整图表。为此,您需要在每次遇到重复的电路板状态时添加边缘。