標籤:
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)
-
輸出
-
按特定順序輸出所有組合。 特定順序:每一個組合中的值從小到大排列,組合之間按字典序排列。
-
範例輸入
-
223
-
範例輸出
-
1221123132213231312321
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 do17 {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 }
C++ 全排列函數 nyoj 366