排列

来源:互联网 发布:javascript const var 编辑:程序博客网 时间:2024/04/28 16:46

普通集合的排列:

#include"iostream"using namespace std;int num[100];int a[100];int n;void next_permutation(int a[],int cur) //从cur 构造序列{    if(cur==n)   //递归边界  当长度达到了序列的长度打印    {        for(int i=0;i<cur;i++)            cout<<a[i]<<" ";        cout<<endl;        return;    }    for(int i=0;i<n;i++)  //选出一个元素 赋值给a[cur]    {        int ok=1;        for(int j=0;j<cur;j++)  //检查这个元素是否合法        if(num[i]==a[j]) {ok=0;break;}  //如果在0...cur-1中出现过说明不可选                if(ok) //如果可选 赋值给a[cur],继续构造。        {            a[cur]=num[i];            next_permutation(a,cur+1);        }    }}int main(){    while(cin>>n)    {        int i;        for(i=0;i<n;i++)            cin>>num[i];        cout<<"集合的全排列:"<<endl;        next_permutation(a,0);    }}

可重集:

#include"iostream"#include"map"using namespace std;int num[100];int a[100];int n;void next_permutation2(int a[],int cur) //从cur 构造序列{    if(cur==n)   //递归边界  当长度达到了序列的长度打印    {        for(int i=0;i<cur;i++)            cout<<a[i]<<" ";        cout<<endl;        return;    }    for(int i=0;i<n;i++)  //选出一个元素 赋值给a[cur]    {        map<int,int>cnt1;        map<int,int>cnt2;        for(int j=0;j<cur;j++) cnt1[a[j]]++;        for(int j=0;j<n;j++) cnt2[num[j]]++;        if(cnt1[num[i]]<cnt2[num[i]])        {            a[cur]=num[i];            next_permutation2(a,cur+1);        }    }}void next_permutation(int a[],int cur) //从cur 构造序列{    if(cur==n)   //递归边界  当长度达到了序列的长度打印    {        for(int i=0;i<cur;i++)            cout<<a[i]<<" ";        cout<<endl;        return;    }    for(int i=0;i<n;i++)  //选出一个元素 赋值给a[cur]    {        int c1,c2;c1=c2=0;        for(int j=0;j<cur;j++) if(a[j]==num[i]) c1++;  //在a[0...cur-1]中等于num[i]的元素的个数        for(int j=0;j<n;j++) if(num[j]==num[i]) c2++;  //在num[0...n-1]中等于num[i]的元素的个数        if(c1<c2) //说明这个元素还没有用完,可以选择        {            a[cur]=num[i];            next_permutation(a,cur+1);        }    }}int main(){    while(cin>>n)    {        int i;        for(i=0;i<n;i++)            cin>>num[i];        cout<<"可重集合的全排列:"<<endl;        next_permutation(a,0);        cout<<"可重集合的全排列:"<<endl;        next_permutation2(a,0);    }}

STL  函数next_permutation(_BidirectionalIterator __first,_BidirectionalIterator __last):

#include"iostream"#include"map"#include"algorithm"using namespace std;int num[100];int a[100];int n;int main(){    while(cin>>n)    {        int i;        for(i=0;i<n;i++)            cin>>num[i];        do        {            for(i=0;i<n;i++)                cout<<num[i]<<" ";            cout<<endl;        }while(next_permutation(num,num+n));    }}


0 0
原创粉丝点击