#682. 【递归】n个数的全排列

【递归】n个数的全排列

说明

从键盘读入nn个整数(每个数都是1~9之间的数),输出这nn个整数的全排列(数字不能重复)

输入格式

第1行输入一个整数n1n8n(1\leqslant n\leqslant 8)

第2行输入nn个不相等的整数(1\leqslant 每个数\leqslant 9)

输出格式

输出若干行,每行包括nn个数据,表示一种排列方案,所有的排列按字典码从小到大排序输出

样例

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;
}