题目地址:
https://www.acwing.com/problem/content/825/
给定一个整数 n n n,将数字 1 ∼ n 1∼n 1∼n排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。
输入格式:
共一行,包含一个整数
n
n
n。
输出格式:
按字典序输出所有排列方案,每个方案占一行。
数据范围:
1
≤
n
≤
9
1≤n≤9
1≤n≤9
直接DFS。代码如下:
#include <iostream>
using namespace std;
int n, a[10];
bool vis[10];
void dfs(int u) {
if (u == n) {
for (int i = 0; i < n; i++) printf("%d ", a[i]);
puts("");
return;
}
// 枚举a[u]应该填哪个数
for (int i = 1; i <= n; i++)
// 略过用过的数
if (!vis[i]) {
vis[i] = true;
a[u] = i;
dfs(u + 1);
vis[i] = false;
}
}
int main() {
cin >> n;
dfs(0);
return 0;
}
时间复杂度 O ( n n ! ) O(nn!) O(nn!),空间 O ( n ) O(n) O(n)。