递归 DFSDFS
【知识点】
DFSDFS;搜索;递归;剪枝优化。
【本题思路】
(1)常规递归 DFSDFS 思路。
(2)剪枝优化 DFSDFS:由于任何排列中所有数的和都恒等,因此可以根据恒等和直接求出最后一个数,实现剪枝优化。
【时间复杂度】
递归 DFS:T(n)=O(n∗n!)T(n)=O(n∗n!)。
剪枝优化 DFS:T(n)=O(n!)T(n)=O(n!)。
【注意点】
(1)常规操作:首先根据递归条件判断是否应该结束。
(2)注意递归结束条件和 0/10/1 选择的权衡。
using namespace std;
const int N = 10;
int path[N];
bool st[N];
int n;
void dfs(int u) {
if (u == n) {
for (int i = 0; i < n; i++) printf("%d ", path[i]);
puts("");
return;
} else {
for (int i = 1; i <= n; i++) {
if (!st[i]) {
path[u] = i;
st[i] = true;
dfs(u + 1);
path[u]=0;
st[i] = false;
}
}
}
}
int main() {
scanf("%d", &n);
dfs(0);
return 0;
}