#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[4]={1,2,3,4};
do{
cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl;
}
while(next_permutation(a,a+4));
system("pause");
}
该段代码意思为求1,2,3,4的全排列。
next_permutation(a,a+4)
即求括号中内容的下一个排列。如:a[4]={1,2,3,4}.next_permutation(a,a+4) 即为1,2,4,3.
函数原型:
若为4,3,2,1.next_permutation的返回值即为false,因为没有下一个排列。但是经过一次函数调用之后会变为1,2,3,4.
与之相对的还有一个函数为prev_permutation() 顾名思义,该函数为求上一个排列。
百度百科中的解释如下:
next_permutation函数将按字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止。prev_permutation函数与之相反,是生成给定序列的上一个较小的排列。二者原理相同,仅遍例顺序相反
问题:如何求一个数组的下一个排列?
假设该数组为3 6 4 2.下一个排列应为 4 2 3 6.
过程:对于一个任意序列,最小的排列是增序,最大的为减序。
从最后一位向前看,首先得到的是2,单纯的一个数不需要进行交换。
然后得到的是 4 2,4大于2,在这个子序列中已经为最大序列,无法排出更大的序列了。
然后得到的是 6 4 2,原理同上。
之后得到的是 3 6 4 2,此时由于3小于6且小于4,而 3 6 4 2的下一个排列应为比3 6 4 2这个排列大的排列中最小的那个,所以3应该和4进行交换,此时该排列变为 4 6 3 2.此时4位于首端,所以之后的序列应为最小序列,即 2 3 6.综上,最终结果应为 4 2 3 6.
使用到该函数的例题:
2015-蓝桥杯-3题:
code:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int a[10];
for(int i = 0; i <= 9; i++)
{
a[i] = i;
}
do
{
if(!a[2] || !a[6])
continue;
int x = a[2] * 1000 + a[3] * 100 + a[4] * 10 + a[5];
int y = a[6] * 1000 + a[7] * 100 + a[8] * 10 + a[3];
int z = a[6] * 10000 + a[7] * 1000 + a[4] * 100 + a[3] * 10 + a[9];
if(x + y == z)
cout <<y<<endl;
}while(next_permutation(a, a + 10));
return 0;
}