全排列

来源:互联网 发布:网页在线客服软件 编辑:程序博客网 时间:2024/04/30 01:37

输出一个数的全排列:

C++的标准函数库STL中,next_permutation()函数用于求数列的全排列

#include<iostream>

#include <algorithm>

#include<cstring>

using namespace std;

#include<vector>

int main ()

{

    int t;

    cin>>t;

    int n;

    while(t--)

    {

        cin>>n;

    int m[1000];

    memset(m,0,sizeof(m));

    for(int i=0;i<n;i++)

        m[i]=i+1;

    do

    {

        for(int i=0;i<n;i++)

       cout<<m[i];

        cout<<endl;

}

while ( next_permutation (m,m+n) );

    }

    return 0;

}

递归方法:
#include<stdio.h>
int a[100000];
void we(int n,int *a,int ni)
{
    if(ni==n)//递归边界
    {
        for(int i=0;i<n;i++)
            printf("%d ",a[i]);
        printf("\n");
    }
    else
    for(int i=1;i<=n;i++)//尝试在a[ha]中填各种整数i
    {
        int ha=1;
        for(int j=0;j<ni;j++)
        {
            if(a[j]==i)
                ha=0;//如果i已经在a[0]~a[ni-1]出现过,则不能再选
        }
        if(ha)
        {
            a[ni]=i;
            we(n,a,ni+1);//递归调用
        }
    }
}
int main()
{
    int l;
    while(scanf("%d",&l)!=-1)
    {
        we(l,a,0);
    }

}


输入一个数组b,并按字典序输出数组a的各元素的所有从小到大的排列,并不重复
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[1000],b[1000];
void we(int n,int *b,int *a,int ni)
{
    if(ni==n)//递归边界
    {
        for(int i=0;i<n;i++)
            printf("%d ",a[i]);
        printf("\n");
    }
    else
    for(int i=0;i<n;i++)//尝试在a[ha]中填各种整数p[i]
    {
        if(!i||b[i]!=b[i-1])//防止输入1 1 1(结果只能是1 1 1)时。。会输出27个1 1 1,因为数组已经排好序,所以只需要检查b的第一个元素和所有“与前一个不相等的元素”
        {
        int cui=0,hua=0;
        for(int j=0;j<ni;j++)
        {
            if(a[j]==b[i])
                cui++;//记录b[i]已经在a[0]~a[ni-1]出现次数
        }
        for(int j=0;j<n;j++)
        {
            if(b[j]==b[i])//记录b[i]在b数组中出现的次数
                hua++;
        }
        if(cui<hua)//如果cui<hua则递归
        {
            a[ni]=b[i];
            we(n,b,a,ni+1);//递归调用
        }
        }
    }
}
int main()
{
    int k;
    while(scanf("%d",&k)!=-1)
    {
        for(int i=0;i<k;i++)
        {
            scanf("%d",&b[i]);
        }
        sort(b,b+k);
        we(k,b,a,0);
    }
}






0 0
原创粉丝点击