全排列总结

来源:互联网 发布:linux 解压缩war包 编辑:程序博客网 时间:2024/05/22 15:14

若给你一堆数,让你输出他的全排列,可以有以下方式实现,不过各有优点和缺点:


1.深度优先搜索:

#include<stdio.h>d#include<string.h>#include<algorithm>#include<math.h>using namespace std;int n;int book[100];int ch[100];int kong[100];void dfs(int step){    if(step==n+1)    {        for(int i=1;i<=n;i++)        {            printf("%d",kong[i]);        }        printf("\n");        return;    }    for(int i=0;i<n;i++)    {        if(book[ch[i]]==0)        {            book[ch[i]]=1;            kong[step]=ch[i];            dfs(step+1);            book[ch[i]]=0;        }    }}int main(){    scanf("%d",&n);    for(int i=0;i<n;i++)    {        scanf("%d",&ch[i]);    }    dfs(1);}
2.next_permutation:
#include<stdio.h>d#include<string.h>#include<algorithm>#include<math.h>using namespace std;int ch[100];int n;int main(){    scanf("%d",&n);    for(int i=0;i<n;i++)    {        scanf("%d",&ch[i]);    }    do    {        for(int i=0;i<n;i++)        printf("%d",ch[i]);        printf("\n");    }while(next_permutation(ch,ch+n));}
若对前n-1个数字排序,只需要把ch+n变成ch+n-1,对前多少个数字排序就ch+多少,用next_permutation()排序只是从当前的数列开始,按字典序上升的顺序输出后边的数列。

而perv_permutation()则是从当前出发,按字典序下降的顺序输出。


3.康拓展开


#include<stdio.h>#include<string.h>#include<algorithm>#include<math.h>using namespace std;typedef long long LL;int ans;LL fact[5];void getfact(int n){    fact[0]=1;    for(int i=1;i<=n;i++)    {        fact[i]=fact[i-1]*i;    }}LL cantor(int *ch,int len){    int ans=0;    LL sum=0;    for(int i=0;i<len;i++)    {        ans=0;        for(int j=i+1;j<len;j++)        {            if(ch[j]<ch[i])                ans++;        }        sum+=ans*fact[len-1-i];    }    return sum;}int main(){    getfact(5);    int ch[4]={4,2,1,3};    printf("%d\n",cantor(ch,4));}
康拓展开是实现找到某一数列在所有的展开数列中排第几位,


cantor=an*(n-1)!+an-1*(n-2)!+.........+a1*0!      此公式就是康拓展开式,

例如{4,2,1,3}排列在所有的排列中排第几,

a4-------->指4在  该数列并且能填的    中按字典序的顺序排第几名,从0开始计数,明显是3

a3-------->指2在   能填的数2,1,3中排第1,因此a3=1

a2-------->指1在   能填的数1,3中排第0,因此a2=0

a1-------->指3在能填的数中排  0,因此a1=0.

因此4213在所有的排列中排名第   3*3!+1*2!+0+0=20,(从0开始计数,排名20)



原创粉丝点击