最近做了TjuOj上關於全排列的幾個題,室友告訴了一個非常好用的函數,谷歌之,整理如下:
next_permutation函數
組合數學中經常用到排列,這里介紹一個計算序列全排列的函數:next_permutation(start,end),和prev_permutation(start,end)。這兩個函數作用是一樣的,區別就在於前者求的是當前排列的下一個排列,后一個求的是當前排列的上一個排列。至於這里的“前一個”和“后一個”,我們可以把它理解為序列的字典序的前后,嚴格來講,就是對於當前序列pn,他的下一個序列pn+1滿足:不存在另外的序列pm,使pn<pm<pn+1.
對於next_permutation函數,其函數原型為:
#include <algorithm>
bool next_permutation(iterator start,iterator end)
當當前序列不存在下一個排列時,函數返回false,否則返回true
我們來看下面這個例子:
輸出結果為:
當我們把while(next_permutation(num,num+3))中的3改為2時,輸出就變為了:
由此可以看出,next_permutation(num,num+n)函數是對數組num中的前n個元素進行全排列,同時並改變num數組的值。
另外,需要強調的是,next_permutation() 在使用前需要對欲排列數組按升序排序,否則只能找出該序列之后的全排列數。比如,如果數組num初始化為2,3,1,那么輸出就變為了: