Q. 【递归】n个数的全排列
【递归】n个数的全排列
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
说明
从键盘读入个整数(每个数都是1~9之间的数),输出这个整数的全排列(数字不能重复)
输入格式
第1行输入一个整数
第2行输入个不相等的整数(1每个数 9)
输出格式
输出若干行,每行包括个数据,表示一种排列方案,所有的排列按字典码从小到大排序输出
样例
3
2 4 6
2 4 6
2 6 4
4 2 6
4 6 2
6 2 4
6 4 2
参考程序
// P682 【递归】n个数的全排列
#include <bits/stdc++.h>
using namespace std;
const int N = 10;
int n, a[N], st[N], ans[N];
// st[i] 表示第 i 个人是否坐下
// ans[i] 记录的是第 i 个凳子坐的人的编号,那么他的值就是 a[ ans[i] ]
// dfs(u): 当前应该从 第 u 个凳子开始坐人
void dfs(int u) {
if (u > n) {
for (int i = 1; i <= n; i++)
printf("%d ", a[ans[i]]);
puts("");
return;
}
// 枚举那些人可以坐
for (int i = 1; i <= n; i++) {
// 如果 第 i 个人还没有坐下,那么他有两种选择:坐下,不坐
if (!st[i]) {
// 第 i 个 人 坐在第 u 个板凳上,于是就该下一个板凳坐人了
st[i] = 1, ans[u] = i, dfs(u + 1);
// 第 i 个人没有坐下,那么需要回溯到坐下前的状态
st[i] = 0;
}
}
}
void slove() {
do {
for (int i = 1; i <= n; i++)
printf("%d ", a[i]);
puts("");
} while (next_permutation(a + 1, a + 1 + n));
// next_permutation(首地址,首地址+元素个数);
// 求下一个全排列,如果有返回 1,没有返回 0.
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
sort(a + 1, a + 1 + n);
// dfs(1); // 从 第 1 个凳子开始坐人
slove();
return 0;
}