(一)深度优先搜索(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写暴力,可以卡时骗分