万能的搜索--之DFS(二)
2018-04-14 22:00
666 查看
(一)深度优先搜索(DFS)
我们先给出深度优先的解决办法,所谓深度优先搜索,在迷宫问题里就是不撞南墙不回头,能走得深一点就尽量深一点。如果碰到了墙壁就返回前一个位置尝试其他的方向。在《啊哈!算法》中作者给出了一个深度优先搜索的基本模型,笔者认为比较贴切。
基本框架:
例:最简单的DFS——全排列(全排列是啥,请自行度娘)
输入n,输出n的全排列
Input
3
Output
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
经典题:八皇后问题:
☟
☟
☟
☟
☟
☟
☟
☟
☟
☟
☟
☟
伪代码:
总结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写暴力,可以卡时骗分
相关文章推荐
- 【万能搜索】万能DFS之全排列(一)——普通算法
- 华为题 搜索水题 DFS
- Oil Deposits (dfs)深度搜索
- HDU-N皇后问题-DFS深度搜索
- 蓝桥杯 历届试题 剪格子(dfs搜索)
- DFS深度优先搜索
- DFS深度优先搜索之走迷宫
- 搜索 -dfs-POJ-2488-A Knight's Journey
- HDU 1175 连连看 DFS+搜索+方向
- 【搜索】POJ-3050 基础DFS
- 全排列 dfs(深度搜索)
- 【算法分类】【搜索】【DFS】枚举所有子集
- 2013年第四届蓝桥杯C/C++省赛 第39级台阶(结果填空) ----DFS深度搜索遍历和暴力搜索
- 2016年蓝桥杯省赛A组C/C++ 第二题 跳蚱蜢(dfs搜索+状态压缩)
- DFS--深度优先搜索--图的邻接表表示
- 深度优先搜索DFS(depth first search),拓扑排序
- nyoj 部分和问题(深度优先搜索DFS)
- 深度优先搜索DFS例题--棋盘问题题解(参考写的)
- 算法学习笔记11-DFS深度优先搜索
- 深度优先搜索--DFS