庫函式求全排列

2021-08-29 16:22:42 字數 1722 閱讀 5755

上級排列:prev_permutation(start, end)                //求的是當前排列的上乙個排列

對於「上乙個」和「下乙個」,它們為字典序的前後,就是對於當前序列pn,他的下乙個序列pn+1,不存在另外的pm,使得pn字典序:不同排列的先後關係是從左——>右逐個比較對應的數字的先後來決定的。

例如:——對於6個數字的排列123456和123465,按照字典序的定義,123456排在123465的前面。

——比較單詞(lead和leader),把短的排前面。

對於next_permutation函式,其原型為:

#include

bool next_permutation(iterator start,  iterator end)

當當前序列不存在下乙個排列時,返回false,否則返回true。

對於這兩個函式一般和do ~ while搭配。

#include#include#includeusing namespace std;

int main()

; dowhile(next_permutation(num, num+3));

return 0;

}

輸出結果:

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

如果把while(next_permutation(num, num+3))中的3改為2,則輸出結果為:

1 2 3

2 1 3

可以從中看出這個函式是對陣列num中的前n個元素進行全排列,同時並改變num[ ]的值 。

如果把初始陣列改為:int num = ;則輸出結果為:

2 3 1

3 1 2

3 2 1

可以從中看出這個結果是在初始值往後的全排列。

如果輸入的是字串,原**改為:

char ch[50];

scanf("%s", ch);

int n = strlen(ch);

sort(ch, ch+strlen(ch));

dowhile(next_permutation(ch, ch+n));

**實現:

#include#include#include#includeusing namespace std;

int main()

while(next_permutation(s, s+l));

return 0;

}

**實現:

#include#include#include#includeusing namespace std;

int val(char c)

bool cmp(char a, char b)

int main()

while(next_permutation(str, str+n, cmp));

} return 0;

}

遞迴求全排列

取出陣列中第乙個元素放到最後,即a 1 與a n 交換,然後遞迴求a n 1 的全排列 1 如果陣列只有乙個元素n 1,a 則全排列就是 2 如果陣列有兩個元素n 2,a 則全排列是 a 1 與a 2 交換。交換後求a 2 1 的全排列,歸結到1 a 2 與a 2 交換。交換後求a 2 1 的全排列...

求全排列 可重複 next permutation

字典序列演算法 字典序列演算法是一種非遞迴演算法。而它正是stl中next permutation的實現演算法。我們來看看他的思路吧 它的整體思想是讓排列成為可遞推的數列,也就是說從前一狀態的排列,可以推出一種新的狀態,直到最終狀態。比如說,最初狀態是12345,最終狀態是54321。其實我覺得這跟...

C STL求全排列和組合

c 11 stl內建了求全排列的模板函式next permutation和prev permutation,屬於標頭檔案和std命名空間,使用非常方便。例如 vector a while next permutation a.begin a.end for int i 0 i a.size 2 i ...