一、
stl提供了兩個用來計算排列組合關係的演算法,分別是next_permutation和prev_permutation。首先我們必須了解什麼是「下乙個」排列組合,什麼是「前乙個」排列組合。考慮三個字元所組成的序列。
這個序列有六個可能的排列組合:abc,acb,bac,bca,cab,cba。這些排列組合根據less-than操作符做字典順序(lexicographical)的排序。也就是說,abc名列第一,因為每乙個元素都小於其後的元素。acb是次乙個排列組合,因為它是固定了a(序列內最小元素)之後所做的新組合。
同樣道理,那些固定b(序列中次小元素)而做的排列組合,在次序上將先於那些固定c而做的排列組合。以bac和bca為例,bac在bca之前,因為次序ac小於序列ca。面對bca,我們可以說其前乙個排列組合是bac,而其後乙個排列組合是cab。序列abc沒有「前乙個」排列組合,cba沒有「後乙個」排列組合。
next_permutation()會取得[first,last)所標示之序列的下乙個排列組合,如果沒有下乙個排列組合,便返回false;否則返回true。這個演算法有兩個版本。版本一使用元素型別所提供的less-than操作符來決定下乙個排列組合,版本二則是以仿函式comp來決定。
演算法思想:
1.首先從最尾端開始往前尋找兩個相鄰元素,令第一元素為*i,第二元素為*ii,且滿足*i
2.找到這樣一組相鄰元素後,再從最尾端開始往前檢驗,找出第乙個大於*i的元素,令為*j,將i,j元素對調(swap)。
3.再將ii之後的所有元素顛倒(reverse)排序。
二、遞迴實現
思路:可以通過遞迴的方法把n的全排列問題轉化為n-1的全排列問題,逐漸推導到乙個數字的全排列,顯然乙個數字的全排列方式只有一種
下面這種無法保證按字典序輸出
#include #include #define n 100
using namespace std;
void permutation(char* a, int k, int m)
else }
} int main()
若要按字典序全排,可參考全排列(按字典序) 開學第二週
開學已經兩周了,然後我們就又放假了 問號臉?總感覺一到上學的時候就又該放假了 仔細想想好像是這樣 不過相比於上半年來說,下半年的放假時間還算是少的,只不過對於我來說都一樣,不管在哪都是學習 貌似有點悲哀 只不過是學習的東西不一樣罷了。就學業的學習上來說,這一學期的學科難度遠超上一學期,因為多了很多的...
開學第二週 two 快速冪)
時間過得真是快呀,第二週就要結束了,感覺有時自己在瞎忙。關於快速冪及矩陣快速冪的題目,我在寒假就遇見過了,那時一看是新知識點,沒有立即消化吸收,只是簡單收藏在csdn中,想著 抽空再看吧!現在看來這個想法很危險 可是新知識如雨後新竹般,來不及學習的早已埋在收藏中了。唉,明日復明日,明日何其多?要警醒...
開學第九周 One(二分三分及其思想)
明天就是運動會啦,平白多了兩天的假期,真好,可以放鬆一下,當然,題目也是不能放下的,正好也可以補補以前的坑。搜尋專題也快結束了,我現在對bfs狀態的壓縮還是有些迷。第一次接觸覺得很神奇,靠乙個整型就可以列舉二三十種狀態,這也改變了我對位運算的看法,位運算真的叼。老師又開了二分專題,由二分查詢引入二分...