跳转到内容

DFS

枚举所有可能、回溯搜索、连通块统计、路径探索等问题。

一条路先走到底,走不通再回退,尝试下一种选择。

#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> path;
vector<bool> used;
void dfs(int step) {
if (step == n) {
for (int x : path) cout << x << " ";
cout << '\n';
return;
}
for (int i = 1; i <= n; i++) {
if (!used[i]) {
used[i] = true;
path.push_back(i);
dfs(step + 1);
path.pop_back();
used[i] = false;
}
}
}
int main() {
cin >> n;
used.assign(n + 1, false);
dfs(0);
return 0;
}
  • 没有写递归出口。
  • 回溯时忘记撤销标记。
  • 递归层数太深导致栈溢出。