我被要求实施宽度优先搜索以解决八个谜题,用一个包含9个元素的向量表示每个状态,将图块编号(或间隙为0)存储为位置中的数据。
例如[1, 3, 4, 2, 8, 0, 6, 7, 5]
表示:
1 3 4
2 8 # <- Gap here
6 7 5
到目前为止,我的伪编码算法是:
startnode.configuration = start
startnode.parent = NIL
startnode.distance = 0
startnode.state = DISCOVERED
nodes_to_process = queue {}
nodes_to_process.enqueue(startnode)
while nodes_to_process is not empty
node = nodes_to_process.dequeue()
for each neighbour in NEIGHBOURS(node)
if neighbour.state == UNDISCOVERED
neighbour.distance = node.distance + 1
neighbour.parent = node
neighbour.state = DISCOVERED
问题在于:当我添加新邻居时,如何跟踪哪些节点已被分配为已访问?我应该逐个比较状态数组(preferaby有一组有序的),还是有更精细的方法,我可以跳过这个数组比较步骤?搜索的最佳算法复杂度为O(N * ln N)吗?