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写暴力,可以卡时骗分

  • 相关阅读:
    最简单跳转,待反混爻的合集
    搜索引擎劫持代码
    Warning: Cannot modify header information
    editplus 正则删换行
    在全程Linux環境部署IBM Lotus Domino/Notes 8.5
    3.5-杂项②
    3.4-杂项①
    3.3-ISDN
    3.2-帧中继②
    3.2-帧中继①
  • 原文地址:https://www.cnblogs.com/rmy020718/p/8835998.html
Copyright © 2011-2022 走看看