在c++的模板中,有一對專門用於實現數字或字元全排列的模板:next_permutation(_biter, _biter)和prev_permutation(_biter, _biter)。前者實現向後排列,後者實現向前排列,即前者在原順序上依次產生較大的排列,後者則相反。
舉個例子:假設需要產生以「354」為基礎的全排列,使用next_permutation(_biter, _biter),則下乙個排列為「435」,而使用prev_permutation(_biter, _biter),則下乙個排列為「345」。
#include
using
namespace
std;
int main()
輸出結果為:
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321
從上面的結果中我們可以發現沒有原始排列「1234」,這時因為該模板實現的是以原始排列為基礎依次產生後序排列,所以並不會產生原始的排列,這裡需要注意下!
如果我們把上述**中的next_permutation(ss.begin(), ss.end())
換成prev_permutation(ss.begin(), ss.end())
會產生什麼結果呢?
結果如下:
什麼都沒有,這又是為什麼呢?這是因為prev_permutation(_biter, _biter)產生的是以「1234」為基礎的更小的排列,但是「1234」已經是最小的排列了,那麼自然就不會產生任何結果了。既然是這樣那我們把原ss改為「4321」是不是就可以了呢,我們看一下執行結果:
4312
4231
4213
4132
4123
3421
3412
3241
3214
3142
3124
2431
2413
2341
2314
2143
2134
1432
1423
1342
1324
1243
1234
果然實現了全排列。(還是要注意,結果中同樣沒有原排列「4321」)
從上面的例子中不難看出,如果給你乙個無序的字串或者陣列,那麼你首先需要對它進行排序,然後才能使用模板來求全排列。
比如:
#include
using
namespace
std;
int main()
; sort(num, num + 5);//先排序
while(next_permutation(num, num + 5))
return
0;}
設r=是要進行排列的n個元素,ri=r-。舉例「123」:1.當n=1時,perm(r)=(r),其中r是集合r中唯一的元素。
2.當n>1時,perm(r)可由(r1)+perm(r1),(r2)+perm(r2),…,(rn)+perm(rn)構成。
1+perm(2,3)→1+(2+prem(3)) = 123
1+perm(2,3)→1+(3+perm(2)) = 132
2+perm(1,3)→2+(1+perm(3)) = 213
2+perm(1,3)→2+(3+perm(1)) = 231
3+perm(2,1)→3+(2+perm(1)) = 321
3+perm(2,1)→3+(1+perm(2)) = 312
實現**如下:
#include
using
namespace
std;
void permutation(int arry, int low, int high)
else
}}int main()
; permutation(num, 0, 3);
return
0;}
執行結果:
1234
1243
1324
1342
1432
1423
2134
2143
2314
2341
2431
2413
3214
3241
3124
3142
3412
3421
4231
4213
4321
4312
4132
4123
全排列的實現
程式設計思路如下 擷取自 erlang程式設計 3.8 除錯的 include include include using namespace std void insert string str,char ch,vector aa void fun string array,vector a st...
全排列實現
參考的是 演算法競賽入門 p185 方法是用乙個額外的陣列a,不斷放入物件到這個陣列中,直到n個為止。include using namespace std int total 0 void permutation char s,char a,int n,int cur total cout end...
STL中的全排列函式實現全排列
標頭檔案 inlcude這裡先說兩個概念 下乙個排列組合 和 上乙個排列組合 對序列 每乙個元素都比後面的小,按照字典序列,固定a之後,a比bc都小,c比b大,它的下乙個序列即為,而的上乙個序列即為,同理可以推出所有的六個序列為 其中沒有上乙個元素,沒有下乙個元素。a.函式模板 next permu...