题目地址:
https://www.luogu.com.cn/problem/P1706
题目描述:
按照字典序输出自然数
1
1
1到
n
n
n所有不重复的排列,即
n
n
n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入格式:
一个整数
n
n
n。
输出格式:
由
1
∼
n
1 \sim n
1∼n组成的所有不重复的数字序列,每行一个序列。每个数字保留
5
5
5个场宽。
数据范围:
1
≤
n
≤
9
1\le n\le 9
1≤n≤9
代码如下:
#include <iostream>
using namespace std;
const int N = 10;
int n;
int a[N];
bool vis[N];
void dfs(int u) {
if (u == n + 1) {
for (int i = 1; i <= n; i++)
printf("%5d", a[i]);
puts("");
return;
}
for (int i = 1; i <= n; i++)
if (!vis[i]) {
a[u] = i;
vis[i] = true;
dfs(u + 1);
vis[i] = false;
}
}
int main() {
scanf("%d", &n);
dfs(1);
return 0;
}
时间复杂度 O ( n n ! ) O(nn!) O(nn!),空间 O ( n ) O(n) O(n)。