【基本思想】
为了求得问题的解,先选择一种可能的情况先前搜索,一旦发现之前的选择是错误的,就退一步重新选择,
继续向前探索,如此反复进行,知道得到问题的解或无解。
【算法原理】
从初始状态,利用规则生成搜索树下一层任一个结点,检查是否出现目标状态,若未出现,以此状态利用规则生成再下一层任一个结点,再检查,重复过程一直到叶节点(即不能再生成新状态节点),当它仍不是目标状态时,回溯到上一层结果,取另一可能扩展搜索的分支。采用相同办法一直进行下去,直到找到目标状态为止。
状态必须在遍历完所有它的子状态后,才可以对同一层中其他子状态遍历。
此过程符合栈先进先出的性质
【具体过程】
- 每次取出栈顶元素,对其进行拓展。
- 若栈顶元素无法继续拓展,则将其从栈中弹出。继续1过程。
- 不断重复直到获得目标状态(取得可行解)或栈为空(无解)。
【具体实现】
递归实现:
int dfs(int step)//当前状态
{
if(当前状态==边界状态)//结束条件
{
记录或输出;
return;
}
for(i=0;i<n;i++)//横向遍历解答树所有子节点
{
/*扩展出一个子状态*/
修改全局变量
if(子状态满足约束条件)
dfs(子状态)
恢复全局变量//回溯部分
}
}
栈实现:
while(!stack.empty())//当栈顶元素不为空
{
temp=Stack.top();//取栈顶元素值
从temp拓展下一个未拓展的状态next;
if( next没有未拓展状态(到达叶节点) )
stack.pop();//移除栈顶元素
else if(状态next满足条件)
stack.push(next);//next入栈
}