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

  • 相关阅读:
    ssh.sh_for_ubuntu1604
    ssh.sh_for_ubuntu1404
    ssh.sh_for_ubuntu1204
    ssh.sh_for_centos
    raw,cow,qcow,qcow2镜像的比较
    Oz 创建Windows2008R2镜像
    Oz 创建Ubuntu镜像
    Oz 创建Debian8镜像
    Oz 创建CentOS7镜像
    Oz 创建CentOS6镜像
  • 原文地址:https://www.cnblogs.com/rmy020718/p/8835998.html
Copyright © 2011-2022 走看看