才发现STL里居然有求全排列的算法!
函数prev_permutation用于求前一个全排列,next_permutation用于求后一个全排列(按字典序),如果排的是结构体需要重载<运算符。
例:
用next_permutation(字典序正序)输出所有全排列:
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct stu
{
int num;
bool operator <(const stu &b)
{
return num<b.num;
}
};
int main()
{
int n;
scanf("%d",&n);
stu a[10];
for(int i=0;i<n;i++)
{
scanf("%d",&a[i].num);
}
sort(a,a+n);
do
{
for(int i=0;i<n;i++)
{
printf("%d ",a[i].num);
}
printf("\n");
}while(next_permutation(a,a+n));
}
用prev_permutation(字典序倒序)输出所有全排列:
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct stu
{
int num;
bool operator <(const stu &b)
{
return num<b.num;
}
};
bool cmp(stu a,stu b)
{
return a.num>b.num;
}
int main()
{
int n;
scanf("%d",&n);
stu a[10];
for(int i=0;i<n;i++)
{
scanf("%d",&a[i].num);
}
sort(a,a+n,cmp);
do
{
for(int i=0;i<n;i++)
{
printf("%d ",a[i].num);
}
printf("\n");
}while(prev_permutation(a,a+n));
}