zoukankan      html  css  js  c++  java
  • 万能的搜索--之DFS(二)

     

    (一)深度优先搜索(DFS)

    我们先给出深度优先的解决办法,所谓深度优先搜索,在迷宫问题里就是不撞南墙不回头,能走得深一点就尽量深一点。如果碰到了墙壁就返回前一个位置尝试其他的方向。在《啊哈!算法》中作者给出了一个深度优先搜索的基本模型,笔者认为比较贴切。

    基本框架:

    void dfs(int step)
    {
        判断边界
        尝试每一种可能 for( i=0;i<n;i++)
        {
            继续下一步 dfs(step+1);
        }
        返回 return;
    }

    例:最简单的DFS——全排列(全排列是啥,请自行度娘)

    输入n,输出n的全排列
    Input
    3
    Output
    1 2 3
    1 3 2
    2 1 3
    2 3 1
    3 1 2
    3 2 1

    void dfs(int now) {
        if (now == n) {
            for (int i = 0; i < n; i++)
                cout << a[i] << " ";
            cout << endl;
            return;
        }
        for (int i = 1; i <= n; i++)
            if (!check[i]) {
                a[now] = i;
                check[i] = true;
                dfs(now + 1);
                check[i] = false;
            }
    }

    经典题:八皇后问题:

                        

                        

                ☟

                        

                        

                        

                        

                          

                          

                          

                          

                          

    伪代码:

    DFS(int dep)
    if (dep == n+1) { 输出方案并返回 }
    for 枚举第dep行放的位置
    if 枚举的位置是合法的
    标记该位置
    DFS(dep + 1)
    解除标记

    总结DFS:

    优点:
    占用空间小
    很快就能找到一个解
    缺点:
    找到的解不一定是最优解
    小技巧:
    用DFS写暴力,可以卡时骗分

  • 相关阅读:
    Java JMX 监管
    Spring Boot REST(一)核心接口
    JSR 规范目录
    【平衡树】宠物收养所 HNOI 2004
    【树型DP】叶子的颜色 OUROJ 1698
    【匈牙利匹配】无题II HDU2236
    【贪心】Communication System POJ 1018
    【贪心】Moving Tables POJ 1083
    Calling Extraterrestrial Intelligence Again POJ 1411
    【贪心】Allowance POJ 3040
  • 原文地址:https://www.cnblogs.com/rmy020718/p/8835998.html
Copyright © 2011-2022 走看看