#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
ll n;
ll a[11];
bool used[11];
ll ans[11];
void recursion(ll i){
    if(i > n){
        for(int i =1;i <=n;i++){
            cout <<ans[i]<<" ";
        }
        cout << endl;
        return;
    }
    for(ll j=1;j <=n;j++){
        if(!used[j]){
            ans[i] = a[j];
            used[j]=1;
            recursion(i+1);
            used[j]=0;
        }
    }
}
int main(){
    cin >> n;
    for(int i =1;i <=n;i++)
        a[i]=i;
    recursion(1);
    return 0;
}
这段代码应该学习一下,
    for(ll j=1;j <=n;j++){
        if(!used[j]){
            ans[i] = a[j];
            used[j]=1;
            recursion(i+1);
            used[j]=0;
        }
    }
这段代码作为核心,这样的代码会考虑顺序,不会优先造成答案乱序(可以与下面代码进行类比),应该还是算学到树算法时用到的递归了。
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
ll n;
ll a[11];
void recursion(ll i){
    if(i == n){
        for(int i =1;i <=n;i++){
            cout <<a[i]<<" ";
        }
        cout << endl;
        return;
    }
    for(ll j=i;j <=n;j++){
        swap(a[j],a[i]);
        recursion(i+1);
        swap(a[j],a[i]);
    }
}
int main(){
    cin >> n;
    for(int i =1;i <=n;i++)
        a[i]=i;
    recursion(1);
    return 0;
}
感谢题解里的大佬给的思路。
2021.11.8