排列数字 全排列模板 三四种风格

124 阅读1分钟

842. 排列数字 - AcWing题库

STL风格全排列

#include<bits/stdc++.h>
using namespace std;
const int N=10;
int a[N];

int main()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++)
    {
        a[i]=i;
    }

    do
    {
        for(int i=1;i<=n;i++)
        {
            cout<<a[i]<<" ";
        }
        cout<<endl;
    }while(next_permutation(a+1,a+1+n));
    
    
    return 0;
}

image.png

代码随想录风格全排列

用一个used数组打标记去重:

image.png

#include<bits/stdc++.h>
using namespace std;
int n;

vector<vector<int>>vv;
vector<int>v;


void dfs(vector<bool>& used)
{
    if(v.size()==n)
    {
        vv.push_back(v);
        return;
    }
    
    //单层搜索逻辑
    for(int i=1;i<=n;i++)
    {
        if(used[i]==true)continue; //已经取过的不能再取了
        
        v.push_back(i);
        used[i]=true;
        dfs(used);
        v.pop_back();
        used[i]=false;
    }
}
int main()
{
    cin>>n;
    vector<bool>used(n,false);
    dfs(used);
    
    
    for(auto it:vv)
    {
        for(auto num:it)
        {
            cout<<num<<" ";
        }cout<<endl;
    }
    return 0;
}

image.png

yxc风格全排列

#include<bits/stdc++.h>
using namespace std;
const int N=10;
int st[N],path[N];
int n;
void dfs(int u)
{
    if(u==n)
    {
        for(int i=0;i<n;i++)printf("%d ",path[i]);
        printf("\n");
    }
    
    for(int i=1;i<=n;i++)
    {
       if(!st[i])
       {
        path[u]=i;
        st[i]=true;
        dfs(u+1);
        st[i]=false;  //回溯
       }
    }
}

int main()
{
   cin>>n;
    dfs(0);
    return 0;
}

image.png

九元学长风格全排列

#include<bits/stdc++.h>
using namespace std;
int n;
const int N=10;
int a[N];
bool vis[N+1];

void f(int k)
{
    if (k == n) {
        for (int i = 1; i <= n; i++) {
            cout << a[i] << " ";
        }
        cout << endl;
        return;
    }
    
    
    for(int i=k;i<=n;i++)
    {
        if(!vis[i])
        {
            {int t=a[k];a[k]=a[i];a[i]=t;}
            f(k+1); 
            {int t=a[k];a[k]=a[i];a[i]=t;}
        }
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        a[i]=i;
    }

    f(1);

    return 0;
}