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

  • 相关阅读:
    【抓包】Charles设置断点
    获取绑定到DataGridView中某一行的数据
    持续集成经验分享Bamboo+Ant+SVN的构建方案
    JIRA.HOME locked被锁的解决方案
    JIRA使用说明
    jira 4.2 使用Oracle数据库的详细安装(含破解)
    Linux + JIRA4.2 + MySQL安装&破解&配置攻略
    EXECUTE IMMEDIATE oracle介绍
    园子里的哪位大哥给我说说WinCE程序的开发,谢谢了
    PL/SQL DEVELOPER中的专用复制(Special Copy)
  • 原文地址:https://www.cnblogs.com/rmy020718/p/8835998.html
Copyright © 2011-2022 走看看