【考点 · 7级】DFS递归搜索 — 深度优先搜索 + 递归实现
DFS(Depth-First Search)是搜索算法的基础。核心思路:沿着一条路走到黑,走不通再回头。用递归实现时,每次选一个未访问的邻居递归深入,回溯时撤销状态。
🔑 关键要素:
DFS vs BFS:DFS 用栈(递归调用栈),走深不走广;BFS 用队列,层层展开。考试常考:全排列、子集、迷宫搜索、连通块计数。
path[] 数组和 used[] 布尔数组。used[i] 表示数字 i 是否已放入排列中。递归时依次尝试每个未使用的数字,放入后标记,递归下一层,递归返回后撤销标记(回溯)。
#include <iostream>
using namespace std;
int n, path[9];
bool used[9];
void dfs(int depth) {
if (depth == n) { // 所有位置都填完了
for (int i = 0; i < n; i++)
cout << path[i] << " ";
cout << endl;
return;
}
for (int i = 1; i <= n; i++) { // 枚举 1~n 每个数字
if (used[i]) continue; // 已用过就跳过
path[depth] = i; // 放入当前位
used[i] = true; // 标记已使用
dfs(depth + 1); // 递归填下一位
used[i] = false; // 回溯:撤销标记
}
}
int main() {
cin >> n;
dfs(0);
return 0;
}
used[i] = false; 这一行——如果忘了撤销,后面的分支就少枚举了数字,结果不全。
vis[x] = true。
used[i] = false),否则漏解。
{0,0,-1,1} 和 {-1,1,0,0} 对应左右上下。别搞混了。
grid[nx][ny] 前先确认 nx、ny 在合法范围内,否则数组越界。