您的位置:首页 > 其它

万能的搜索--之DFS(二)

2018-04-14 22:00 666 查看
(一)深度优先搜索(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写暴力,可以卡时骗分
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: