from pythonds.graphs import Graph, Vertex
def knightTour(n,path,u,limit):
u.setColor('gray')
path.append(u)
if n < limit:
nbrList = list(u.getConnections())
i = 0
done = False
while i < len(nbrList) and not done:
if nbrList[i].getColor() == 'white':
done = knightTour(n+1, path, nbrList[i], limit)
i = i + 1
if not done: # prepare to backtrack
path.pop()
u.setColor('white')
else:
done = True
return done
Figure 中 knightTour 从节点 A 开始.与 A 相邻的节点是 B 和 D。由于 B 在字母 D 之前,DFS选择 B 展开下一个,如 Figure 4 所示。当knightTour 被递归调用时,开始从 B 开始探寻。 B 与 C 和 D 相邻,所以 knightTour 选择接下来探索 C。然而,如 Figure 5 所示,节点 C 是没有相邻节点的死胡同。此时,我们将节点 C 的颜色更改为白色。对 knightTour 的调用返回值 False。从递归调用的返回有效地将搜索回溯到顶点B(参见Figure 6)。列表中要探索的下一个顶点是顶点 D,因此 knightTour 使递归调用移动到节点 D(参见 Figure 7)。从顶点 D 开始,knightTour 可以继续进行递归调用,直到我们再次到达节点 C(参见Figure 8,Figure 9和 Figure 10)。然而,当我们到达节点C时,测试 n <limit 失败,所以我们知道已经耗尽了图中的所有节点。在这一点上,我们可以返回 True,表示我们已经成功地浏览了图。当我们返回列表时,路径具有值[A,B,D,E,F,C],这是我们需要遍历图以访问每个节点的顺序。