【昊昊带你学】深搜(DFS)

来源:互联网 发布:怎么样提高淘宝销量 编辑:程序博客网 时间:2024/05/16 19:35

**************************转载请注明出处!******************************

什么是搜索

         首先,学习搜索,我们必须要知道我们要搜索的是什么。抽象的来讲,是某一种状态。而且是通过各个状态之间的转移来实现搜索的。比如说我们走迷宫。你通过某种路径走到迷宫中某个位置就可以看做一个状态。你想找出走出迷宫的一条路,就可以看做,从入口那一点开始,一步一步转移,直到你出现在出口位置为止。

 

回溯算法

         回溯法又称试探法。先从百度粘一点:

               “用回溯算法解决问题的一般步骤:

           1 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。

           2 确定易于搜索的解空间结构,使得能用回溯法方便地搜索整个解空间 。

           3 以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。

                问题的解空间通常是在搜索问题解的过程中动态产生的,这是回溯算法的一个重要   

               特性。”

         “高深”的东东我们都得使它通俗易懂是吧。我们来举个栗子:从左上角开始遍历九宫格,每次只能走一格(上下左右),且走过的不能再走,不能出九宫格。(刚写完程序回来,艾玛,为了形象一点展示回溯过程,小细节各种多。)输出总共有多少种走法。我写完结果是8种,主页里有专门一篇日志里放了九宫格遍历的全部状态图。形象得向大家展示了状态直接是如何转换的。大家一定要仔细看一看。我下面贴出回溯的那段代码:

        //迷宫问题经常出现的数组 xx和yy 大家思考一下这是什么作用,

        //不懂加群问:80103249

        int xx[5] = {0, -1, 0, 1, 0};

        int yy[5] = {0, 0, 1, 0, -1};

        //下面是dfs()函数中回溯的部分

        for (int i=1; i<=4; i++)

        {

            int xt = x + xx[i];//这里出现了xx和yy大家体会一下这里的for循环和这俩数组

            int yt = y + yy[i]; //的作用是什么。

 

            if ( inPan(xt,yt) && pan[xt][yt] ) //inPan()判断是否在九宫格中,pan[xt][yt]判断是

            {                         //否可以走。

                pan[xt][yt] = 0;                     //可以走则置零

                dfs(xt,yt);                                        //继续深搜

                pan[xt][yt] = 1;                     //这里回溯了,改回没走过的状态。

            }

        }

For循环就是来采取4种决策——上下左右。当采取某一种决策时,我们就将相应的格子置零,调用dfs()继续从那个格子开始搜。但是当dfs()结束之后,我们要接着进行下一个决策,这个时候,我们要将现场恢复原状,即让九宫格看上去好像没有做上一次决策。方法就是将刚刚置零的那个点,再置回1。因为存在回溯,所以dfs()退出之后,是不改变九宫格面貌的。回溯理解起来可能会有一些困难,不过还是老话,你一旦理解了,就发现都是顺其自然的事儿嘛!

 

深搜

         最后我们来好好说说深搜。深搜DFS,深度优先搜索(Deep First Search)。我们前面说过,搜索就是在各种状态中搜索。这些状态可以形成一棵状态树。有第一个状态,通过某些决策,可以生成若干状态,这些状态可以看做先前状态的孩子节点。深搜的时候,一次只需要保存一个状态就可以。相比较宽搜来看,内存开销要小一些,而且编程实现相对容易。不知道还有没有其他什么优点。

 

         深搜暂且给大家讲到这里,这次内容不多,其实也是因为搜索的确不好讲。主要部分就是举的那个栗子~最重要的还是大家自己多练练,多思考思考,另外多跟别人交流。

 

         PS:九宫格遍历的那个程序(.CPP),如果感兴趣可以加qq群:80103249,里面已经共享。

原创粉丝点击