Tree 如何在遍历树时展开树?

Tree 如何在遍历树时展开树?,tree,breadth-first-search,Tree,Breadth First Search,我正在制作一个程序来解决一个3字拼图(3个方块和一个空白),这是一个8字拼图的较小版本。我试图通过将相邻于黑色的块移动到空白空间来构造树;因此,每个状态可以给出2个状态(分支因子=2)。我使用广度优先搜索来求解这棵树,但要遍历这棵树,必须先进行(扩展)。因为我不能永远继续扩展这棵树,所以我必须有一些方法将树扩展到一定的深度,然后遍历它。所以当遍历到达最后一级时,会调用expand()函数来进一步扩展它。有人能给我一个明确的方法或算法来实现这个想法吗?还是有别的办法解决我的问题 保留所有不同板状态

我正在制作一个程序来解决一个3字拼图(3个方块和一个空白),这是一个8字拼图的较小版本。我试图通过将相邻于黑色的块移动到空白空间来构造树;因此,每个状态可以给出2个状态(分支因子=2)。我使用广度优先搜索来求解这棵树,但要遍历这棵树,必须先进行(扩展)。因为我不能永远继续扩展这棵树,所以我必须有一些方法将树扩展到一定的深度,然后遍历它。所以当遍历到达最后一级时,会调用expand()函数来进一步扩展它。有人能给我一个明确的方法或算法来实现这个想法吗?还是有别的办法解决我的问题

保留所有不同板状态的
设置。如果两个板状态在任何位置具有不同的块(空白计数为一块),则两个板状态是不同的。通过使用一致的顺序连接所有数字,可以构建一个字符串来描述状态;大多数语言/库直接支持字符串集

您应该只展开()未访问的板状态。每当您第一次访问某个州时,应将其添加到“已访问州”
集合
。在扩展任何状态之前,请检查它是否已经存在

完整算法(一般宽度优先,无重复搜索)为:


@不,我说这是一个3字谜,因为空间只能沿着一个边(因为只有4个正方形)。因此,空间附近只能有2个块。(删除了我以前的评论-你是对的)我如何展开树?当一个状态在树中没有子节点时,我是否应该简单地将当前状态
t
传递给expand(state t)函数,以便为该节点创建两个新的子节点?或者一次展开最后一级的所有节点是一个更好的主意?为每个状态提供一个“父”字段(不用于状态相等的比较)。无论何时向队列中添加子状态,请将当前状态指定为其父状态。您将在探索树的同时构建它,正如您所希望的那样。要找到目标的最佳路径,只需沿着目标状态的父节点链(直到到达没有父节点的起始节点)。
place initial state into "pending" (a queue)
place initial state into "visited" (a set)
while "pending" is not empty,
   extract its first state, called "next"
   if it is not present in "visited",
      if it is the goal, report success, ending the algorithm
      otherwise, add all its children at the end of "pending"    
if you reach this point, there is no way to reach a goal state from a start state