枚举排列

来源:互联网 发布:解毒丹 知乎 编辑:程序博客网 时间:2024/06/05 14:48

1.生成1~n的排列

代码:

#include<iostream>#include<cstdio>#include<string.h>using namespace std;int sum=0;void print_permutation(int cur,int *a,int n){    if(cur==n)    {        for(int i=0;i<n;i++)            cout<<a[i]<<" ";        cout<<endl;        sum++;    }    else  for(int i=1;i<=n;i++)        {            int ok=1;            for(int j=0;j<cur;j++)            {                if(a[j]==i)                    ok=0;            }            if(ok)            {                a[cur]=i;                print_permutation(cur+1,a,n);            }        }}int main(){    int a[50],p[50];    memset(a,0,sizeof(a));    int n;    cin>>n;    print_permutation(0,a,n);    cout<<sum<<endl;}

2.生成可重集的排列
只能是连续数的重复,如:1,1,1,2,3,4等。不可以对1,2,1,2.进行排列。

#include<iostream>#include<cstdio>#include<string.h>using namespace std;int sum=0;void print_permutation(int *p,int cur,int *a,int n){    if(cur==n)    {        for(int i=0;i<n;i++)            cout<<a[i]<<" ";        cout<<endl;        sum++;    }    else  for(int i=0;i<=n;i++)        if(!i||p[i]!=p[i-1])        {            int c1=0,c2=0;            for(int j=0;j<n;j++)            {                if(p[i]==p[j])                    c2++;            }            for(int j=0;j<cur;j++)            {                if(a[j]==p[i])                    c1++;            }            if(c1<c2)            {                a[cur]=p[i];                print_permutation(p,cur+1,a,n);            }        }}int main(){    int a[50],p[50];    memset(a,0,sizeof(a));    int n;    cin>>n;    for(int i=0;i<n;i++)    {        cin>>p[i];    }    print_permutation(p,0,a,n);    cout<<sum<<endl;}

3.下一个排列
利用#include

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;int main(){    int n,ans=0;    cin>>n;    int a[50];    for(int i=0;i<n;i++)    {        cin>>a[i];    }    sort(a,a+n);    do    {        for(int i=0;i<n;i++)        {            cout<<a[i]<<" ";        }        cout<<endl;        ans++;    }while(next_permutation(a,a+n));    cout<<ans<<endl;}
原创粉丝点击