C++ STL中提供了std::next_permutation与std::prev_permutation可以获取数字或者是字符的全排列,其中std::next_permutation提供升序、std::prev_permutation提供降序。
1.std::next_permutation函数原型
template <class BidirectionalIterator>
bool next_permutation (BidirectionalIterator first, BidirectionalIterator last );
template <class BidirectionalIterator, class Compare>
bool next_permutation (BidirectionalIterator first,BidirectionalIterator last, Compare comp);
说明:next_permutation,重新排列范围内的元素[第一,最后一个)返回按照字典序排列的下一个值较大的组合。
返回值:如果有一个更高的排列,它重新排列元素,并返回true;如果这是不可能的(因为它已经在最大可能的排列),它按升序排列重新元素,并返回false。
2.算法实现原理
见:http://hi.baidu.com/bellgrade/item/70b65b8a7ea3c9c398255fd4
算法描述:
1、从尾部开始往前寻找两个相邻的元素
第1个元素i,第2个元素j(从前往后数的),且i<j
2、再从尾往前找第一个大于i的元素k。将i、k对调
3、[j,last)范围的元素置逆(颠倒排列)
例:
D的小L
时间限制:4000 ms | 内存限制:65535 KB
难度:2
- 描述
- 一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给匡匡出了个题目想难倒匡匡(小L很D吧),有一个数n(0<n<10),写出1到n的全排列,这时匡匡有点囧了,,,聪明的你能帮匡匡解围吗?
- 输入
- 第一行输入一个数N(0<N<10),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个整数x(0<x<10)
- 输出
- 按特定顺序输出所有组合。 特定顺序:每一个组合中的值从小到大排列,组合之间按字典序排列。
- 样例输入
-
2 2 3
- 样例输出
-
12 21 123 132 213 231 312 321
1 #include <cstdio> 2 #include <algorithm> 3 4 using namespace std; 5 int a[]={1,2,3,4,5,6,7,8,9}; 6 int main() 7 { 8 int t; 9 scanf("%d", &t); 10 while(t--){ 11 int n; 12 scanf("%d", &n); 13 // for(int i = 0; i < n; i++){ 14 // a[i] = i + 1; 15 // } 16 do 17 { 18 for(int i = 0; i < n; i++){ 19 printf("%d", a[i]); 20 } 21 printf("\n"); 22 }while (next_permutation(a, a + n)); 23 } 24 25 return 0; 26 }
字符:
1 #include <iostream> 2 #include <algorithm> 3 #include <string> 4 5 using namespace std; 6 7 int main() 8 { 9 string str; 10 cin >> str; 11 sort(str.begin(), str.end()); 12 cout << str << endl; 13 while (next_permutation(str.begin(), str.end())) 14 { 15 cout << str << endl; 16 } 17 return 0; 18 }