万能的搜索--之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写暴力,可以卡时骗分

 

posted @ 2018-04-14 22:00  Manjusaka丶梦寒  阅读(235)  评论(0编辑  收藏  举报