C/C++编程笔记:DFS 深度优先搜索的基本思想,含实例讲解

本文详细介绍了深度优先搜索(DFS)的基本思想和算法框架,通过非递归和递归两种方式展示了如何在C/C++中实现DFS。以黑色方块问题为例,展示了DFS的应用,帮助理解其工作原理。
摘要由CSDN通过智能技术生成

        采用搜索算法解决问题时,需要构造一个表明状态特征和不同状态之间关系的数据结构,这种数据结构称为结点。不同的问题需要用不同的数据结构描述。

        根据搜索问题所给定的条件,从一个结点出发,可以生成一个或多个新的结点,这个过程通常称为扩展。结点之间的关系一般可以表示成一棵树,它被称为解答树。搜索算法的搜索过程实际上就是根据初始条件和扩展规则构造一棵解答树并寻找符合目标状态的结点的过程。

        深度优先搜索DFS(Depth First Search)是从初始结点开始扩展,扩展顺序总是先扩展最新产生的结点。这就使得搜索沿着状态空间某条单一的路径进行下去,直到最后的结点不能产生新结点或者找到目标结点为止。当搜索到不能产生新的结点的时候,就沿着结点产生顺序的反方向寻找可以产生新结点的结点,并扩展它,形成另一条搜索路径。

        为了便于进行搜索,要设置一个表存储所有的结点。由于在深度优先搜索算法中,要满足先生成的结点后扩展的原则,所以存储结点的表一般采用栈这种数据结构。

        深度优先搜索算法的搜索步骤一般是:

      (1)从初始结点开始,将待扩展结点依次放到栈中。

      (2)如果栈空,即所有待扩展结点已全部扩展完毕,则问题无解,退出。

      (3)取栈中最新加入的结点,即栈顶结点出栈,并用相应的扩展原则扩展出所有的子结点,并按顺序将这些结点放入栈中。若没有子结点产生,则转(2)。

      (4)如果某个子结点为目标结点,则找到问题的解(这不一定是最优解),结束。如果要求得问题的最优解,或者所有解,则转(2),继续搜索新的目标结点。

深度优先搜索算法的框架一般为:

void  DFS()

{

    栈S初始化;

    初始结点入栈;

    置搜索成功标志flag= false;

    while (栈不为空 && !flag)

    {

          栈顶元素出栈,赋给current;

          while  (current 还可以扩展)

          {

                 由结点current扩展出新结点new;

                  if  (new 重复于已有的结点状态) continue;

                  new结点入栈;

               

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值