一、函数本尊
知周所众,大家在做题的过程中,经常会遇到一些有关于数组全排列的问题,例如……好像没什么例如,总之就是十分有用。小编今天就和大家介绍一个非常神奇的函数——全排列函数。
首先,他本体长这样:next_permutation(a+r,a+l);其作用就是把数组a中区间 [ r , l ) 里的所有数据进行 “ 下一个全排列 ” 操作。他还有个异父异母的亲兄弟:prev_permutation(a+r,a+l);他的作用是进行 “ 上一个全排列 ” 操作。
再就是返回值,两个函数都一样,可以进行操作就返回真,否则就返回假。
二、代码实现
这里举个最煎蛋的栗子,输入一个长度为n的int类数组,输出他的下一个全排列和上一个全排列。
#include <bits/stdc++.h>
using namespace std;
int a[1005],n;
int main ()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
next_permutation(a+1,a+1+n);
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
prev_permutation(a+1,a+1+n);
prev_permutation(a+1,a+1+n);//由于刚才已经执行过next_permutation的操作了,所以这里要写两个
return 0 ;
}
understand?
还有就是关于他的返回值的运用。例如:输入一个int类数组a,输出他是第几个全排列。
#include <bits/stdc++.h>
using namespace std;
int a[1005],n,num;//num存储为第几小
int main ()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
while(prev_permutation(a+1,a+1+n))//只要能变为下一个全排列,num就+1,这样当a变为初始序列时,num即为本题答案
{
num++;
}
printf("%d",num);
return 0 ;
}