基于回溯策略的递归
基本思想:在按某种搜索策略的搜索过程中,在某种状态,继续往前搜索已经确定不会得到正确答案的情况下,我们可以返回上一搜索状态,去沿新的可能性继续搜索。要回溯到上一状态,则说明我们在前进中的状态必须保存下来,我们采用“栈”来存放。
它的求解过程实质上是一个先序遍历一棵“状态树”的过程,只不过这棵树不是预先建立的,而是隐含在遍历的过程中。
回溯法的特点
搜索策略:符合递归算法,问题解决可以化为子问题,算法类似,规模减小。
控制策略:当遇到失败的搜索状态,需要返回上一状态,沿另外的路径搜索。
数据结构:用数组保存搜索过程中的状态、路径。
下面介绍一些例子,分析基于回溯策略递归方法的求解方法。
例一、八皇后问题
在8×8的棋盘上,放置8个皇后(棋子),使两两之 间互不攻击。所谓互不攻击是说任何两个皇后都要 满足:
(1)不在棋盘的同一行; (2)不在棋盘的同一列; (3)不在棋盘的同一对角线上。
数据定义:
- Queen[i] —— 第i行皇后所在的列;
- Column[j]—— 第j列是否安全,{0, 1};
- Down[1..15 ]——记录每一条从上到下的对角线,是否安全,{0,1}
- Up[1..15]——记录每一条从下到上的对角角线,是否安全,{0,1}
<