题目描述 按照字典序输出自然数 1 1 到 � n 所有不重复的排列,即 � n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 � n。 输出格式 由 1 ∼ � 1∼n 组成的所有不重复的数字序列,每行一个序列。 每个数字保留 5 5 个场宽。标签 搜索 数学 递归 深度优先搜索,DFS
时间: 2024-01-09 09:31:28 浏览: 59
这个问题可以通过深度优先搜索(DFS)来解决。我们可以定义一个递归函数来生成所有的排列。
首先,我们需要一个数组来保存当前排列的状态,初始化为全0。然后,我们从1开始递归调用这个函数。在每一层递归中,我们检查当前排列中哪些数字还没有被使用过。对于每个未被使用过的数字,我们将其添加到当前排列中,并将对应的位置标记为已使用。然后,我们继续递归调用函数,生成下一个数字的排列。在递归返回后,我们需要将当前排列的状态恢复,并尝试其他未使用过的数字。
以下是用C++实现的代码示例:
```cpp
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 10;
int used[MAXN];
int permutation[MAXN];
void dfs(int n, int depth) {
if (depth == n) {
for (int i = 0; i < n; i++) {
cout << setw(5) << permutation[i];
}
cout << endl;
return;
}
for (int i = 1; i <= n; i++) {
if (!used[i]) {
used[i] = 1;
permutation[depth] = i;
dfs(n, depth + 1);
used[i] = 0;
}
}
}
int main() {
int n;
cin >> n;
dfs(n, 0);
return 0;
}
```
这个代码会按字典序输出从1到n的所有不重复的排列。每行输出一个序列,每个数字占据5个场宽。
希望对你有帮助!如果还有其他问题,请随时提问。