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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值