全排列
来源:互联网 发布:网页在线客服软件 编辑:程序博客网 时间: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);
}
}