DFS--深度优先搜索

【基本思想】

    为了求得问题的解,先选择一种可能的情况先前搜索,一旦发现之前的选择是错误的,就退一步重新选择,

继续向前探索,如此反复进行,知道得到问题的解或无解。

【算法原理】

    从初始状态,利用规则生成搜索树下一层任一个结点,检查是否出现目标状态,若未出现,以此状态利用规则生成再下一层任一个结点,再检查,重复过程一直到叶节点(即不能再生成新状态节点),当它仍不是目标状态时,回溯到上一层结果,取另一可能扩展搜索的分支。采用相同办法一直进行下去,直到找到目标状态为止。

     状态必须在遍历完所有它的子状态后,才可以对同一层中其他子状态遍历。

     此过程符合栈先进先出的性质

【具体过程】

  1.  每次取出栈顶元素,对其进行拓展。
  2. 若栈顶元素无法继续拓展,则将其从栈中弹出。继续1过程。
  3. 不断重复直到获得目标状态(取得可行解)或栈为空(无解)。

【具体实现】

递归实现:

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入栈
}

猜你喜欢

转载自blog.csdn.net/wentong_xu/article/details/80914522