next_permutation(全排列算法)
2018-01-20 21:11
302 查看
STL提供了两个用来计算排列组合关系的算法,分别是next_permutation和prev_permutation。首先我们必须了解什么是“下一个”排列组合,什么是“前一个”排列组合。考虑三个字符所组成的序列{a,b,c}。
这个序列有六个可能的排列组合:abc,acb,bac,bca,cab,cba。这些排列组合根据less-than操作符做字典顺序(lexicographical)的排序。也就是说,abc名列第一,因为每一个元素都小于其后的元素。acb是次一个排列组合,因为它是固定了a(序列内最小元素)之后所做的新组合。
同样道理,那些固定b(序列中次小元素)而做的排列组合,在次序上将先于那些固定c而做的排列组合。以bac和bca为例,bac在bca之前,因为次序ac小于序列ca。面对bca,我们可以说其前一个排列组合是bac,而其后一个排列组合是cab。序列abc没有“前一个”排列组合,cba没有“后一个”排列组合。
next_permutation()会取得[first,last)所标示之序列的下一个排列组合,如果没有下一个排列组合,便返回false;否则返回true。
简单应用
输出序列{1,2,3,4}字典序的全排列。
1,2,3...n-2, n-1, n1,2,3...n−2,n−1,n
1,2,3...n-2, n, n-11,2,3...n−2,n,n−1
n 个数的第一个的排列,是在 n 个数字的所有排列中字典序最小的,即为 nn 个数字升序排列。后续的排列,后者的字典序都要比前者的字典序大。
现在给你两个数 n 和 k,问你第 k 个 n 个数的排列是怎样的。
输入格式
一行包含两个整数 n,k(1≤n≤1000,1≤k≤10000),数据保证合法,即存在第 kk 个 nn 个数的排列。
输出格式
输出占一行,nn 个整数,表示要求的排列。
样例输入
11 8
样例输出
1 2 3 4 5 6 7 9 8 11 10
这个序列有六个可能的排列组合:abc,acb,bac,bca,cab,cba。这些排列组合根据less-than操作符做字典顺序(lexicographical)的排序。也就是说,abc名列第一,因为每一个元素都小于其后的元素。acb是次一个排列组合,因为它是固定了a(序列内最小元素)之后所做的新组合。
同样道理,那些固定b(序列中次小元素)而做的排列组合,在次序上将先于那些固定c而做的排列组合。以bac和bca为例,bac在bca之前,因为次序ac小于序列ca。面对bca,我们可以说其前一个排列组合是bac,而其后一个排列组合是cab。序列abc没有“前一个”排列组合,cba没有“后一个”排列组合。
next_permutation()会取得[first,last)所标示之序列的下一个排列组合,如果没有下一个排列组合,便返回false;否则返回true。
简单应用
输出序列{1,2,3,4}字典序的全排列。
#include<iostream> #include<algorithm> using namespace std; int main() { int ans[4]={1,2,3,4}; sort(ans,ans+4); /* 这个sort可以不用,因为{1,2,3,4}已经排好序*/ do /*注意这步,如果是while循环,则需要提前输出*/ { for(int i=0;i<4;++i) cout<<ans[i]<<" "; cout<<endl; }while(next_permutation(ans,ans+4)); return 0; }n 个数的排列,就是
1,2,3...n-2, n-1, n1,2,3...n−2,n−1,n
1,2,3...n-2, n, n-11,2,3...n−2,n,n−1
n 个数的第一个的排列,是在 n 个数字的所有排列中字典序最小的,即为 nn 个数字升序排列。后续的排列,后者的字典序都要比前者的字典序大。
现在给你两个数 n 和 k,问你第 k 个 n 个数的排列是怎样的。
输入格式
一行包含两个整数 n,k(1≤n≤1000,1≤k≤10000),数据保证合法,即存在第 kk 个 nn 个数的排列。
输出格式
输出占一行,nn 个整数,表示要求的排列。
样例输入
11 8
样例输出
1 2 3 4 5 6 7 9 8 11 10
#include <iostream> #include <algorithm> using namespace std; int a[10005]; int main() { int n,k; cin>>n>>k; for(int i=0;i<n;i++) a[i]=i+1; for(int i=0;i<k;i++) next_permutation(a,a+n); for(int i=0;i<n;i++) { if(i!=n-1) cout<<a[i]<<" "; else cout<<a[i]<<endl; } }
相关文章推荐
- next_permutation (全排列算法)的使用
- 排列2 next_permutation(全排列算法)
- next_permutation(全排列算法)
- next_permutation(全排列算法)
- next_permutation全排列算法
- next_permutation(全排列算法)
- next_permutation(全排列算法)
- next_permutation(全排列算法)
- next_permutation(全排列算法)
- next_permutation(全排列算法)
- next_permutation(全排列算法)
- next_permutation(全排列算法)
- Ignatius and the Princess II( next_permutation() )
- nyoj 366 [【next_permutation()函数学习】
- POJ 1270 Following Orders(dfs/next_permutation())
- hdu 1027 next_permutation()
- stl算法:next_permutation剖析
- LeetCode Next Permutation
- HDU 1027 Ignatius and the Princess II(stl,next_permutation)
- 数组之Next Permutation---leetcode