回溯范式:没有递归就可以做到这一点吗?

时间:2014-01-25 17:21:42

标签: c++ backtracking iteration recursive-backtracking

示例:使用回溯进行数独解决

如何在没有递归的情况下回溯 - 使用循环?当你调用backtrack()本身时,我才找到解决方案。

1 个答案:

答案 0 :(得分:3)

您可以使用堆栈模拟递归。

基本上,回溯在候选解决方案树中进行深度优先搜索。对于数独,这棵树在叶子上有完全填充的网格,在节点处有部分填充的网格。根是提供的网格。如果网格节点可以通过填充数字从中导出,则网格节点是另一个网格节点的子节点。通过深度优先搜索和回溯之间的类比,您可以轻松地以递归方式或使用堆栈实现回溯。

堆栈可以(在概念上)包含候选网格。首先,将所提供的(并且部分填充的)网格推到堆栈上。然后在while循环内(检查堆栈是否为空),弹出顶部网格。一个检查网格是否完全填满。如果它被完全填充,则验证数独约束,如果满足则返回网格。如果网格未完全填充,则从其生成其他候选网格(可能没有),这些网格都被推入堆栈。这总结了转换的想法,但当然它并没有真正有效。