上級排列:prev_permutation(start, end) //求的是當前排列的上乙個排列對於「上乙個」和「下乙個」,它們為字典序的前後,就是對於當前序列pn,他的下乙個序列pn+1,不存在另外的pm,使得pn字典序:不同排列的先後關係是從左——>右逐個比較對應的數字的先後來決定的。
例如:——對於6個數字的排列123456和123465,按照字典序的定義,123456排在123465的前面。
——比較單詞(lead和leader),把短的排前面。
對於next_permutation函式,其原型為:
#include當當前序列不存在下乙個排列時,返回false,否則返回true。bool next_permutation(iterator start, iterator end)
對於這兩個函式一般和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,則輸出結果為:可以從中看出這個函式是對陣列num中的前n個元素進行全排列,同時並改變num[ ]的值 。1 2 3
2 1 3
如果把初始陣列改為: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 ...