STL提供了两个函数,next_permutation , prev_permutation 用于全排列;
以next_permutation为例
template <class BidirectionalIterator>
bool next_permutation (BidirectionalIterator first,
BidirectionalIterator last );
当存在下一个全排列时,函数返回true。
以int num[n]为例;
1.next_permutation(),若要得到全排列的全部结果,需先将数组num[]内数据由小到大先sort()排序好,输出顺序按字典顺序从小到大。若全排列对象类型为自定义结构体,需要自定义比较函数cmp.格式为next_permutation(num,num+k,cmp);
------------------------------------test 1----------------------------------------------------------
int num[3]={3,2,1};
sort(num,num+3);
do{
printf("%d%d%d\n",num[0],num[1],num[2]);
}while(next_permutation(num,num+3));//对num的前三个元素进行全排列;
//输出结果:
123
132
213
231
312
321
---------------------------------test 2-------------------------------------------------------------
//如果没有对数组进行从小到大排序,则
int num[3]={3,2,1};
// sort(num,num+3);
do{
printf("%d%d%d\n",num[0],num[1],num[2]);
}while(next_permutation(num,num+3));//对num的前三个元素进行全排列;
//输出结果:
321 //因为按字典顺序,原排列321已经是全排列中最大的数了,没有下一个比它更大的了.
------------------------------------test 3----------------------------------------------------------
//对数组前k个元素进行全排列
int num[3]={3,2,1};
sort(num,num+3);
do{
printf("%d%d%d\n",num[0],num[1],num[2]);
}while(next_permutation(num,num+2));//对num的前2个元素进行全排列;
//输出结果:
123
213
2.使用prev_permutation(),要得到全部排列结果,则需要将num[]按从大到小的顺序先排好,输出顺序按字典顺序从大到小.(使用与next_permutation相同)
练习题 nyoj 366 nyoj 19