next_permutation() 全排列函式
阿新 • • 發佈:2018-11-16
排列(Arrangement),簡單講是從
個不同元素中取出
個,按照一定順序排成一列,通常用
表示。當
時,稱為全排列(Permutation)。
從數學角度講,全排列的個數
,但從程式設計角度,如何獲取所有排列?那麼就必須按照某種順序逐個獲得下一個排列,通常按照升序順序(字典序)獲得下一個排列。
例如對於一個集合 { },首先獲取全排列 ;然後獲取下一個排列 ;按此順序, 的全排列如下:
; ; ; ; ; 共 種。
那麼我們有時就需要求下一種全排列,在STL中的algorithm已經給出了一種健壯、高效的方法,即 next_permutation(int *begin, int *end)
注意,這個函式是直接將傳遞的陣列轉換成了下一個全排列陣列,並且有一個返回值。
當返回為
時,表示找到了下一全排列;返回
時,表示無下一全排列。注意,如果從begin到end為降序,則表明全排列結束,逆置使其還原到升序
因而我們可以用這個返回值求得所有的全排列
同時,相對應的,上一個排列即為prev_permutation(int *begin, int *end)
#include<bits/stdc++.h>
using namespace std;
int main() {
char a[3]= {'a','b','c'}; //第一個排列保證正序,有時候根據題目要求,需要對其進行排序處理。
for(int i=1; i<=6; i++) { //i為總共排列的個數 ,及 3!
for(int j=0; j<3; j++)
printf("%c ", a[j]);
printf("\n");
next_permutation(a, a+3);//放在第一個排列的後邊,輸出第一個排列的下一個排列
}
printf("*******************\n");
int b[4]= {0,1,2,3};
do{
for(int i=0; i<4; printf("%d ", b[i++]));
printf("\n");
} while(next_permutation(b, b+4));
printf("*******************\n");
int c[3]={3,2,1};
next_permutation(c, c+3);
for(int i=0; i<3; printf("%d ", c[i++]));
}