C++における全配列関数next_permutationの使い方

3110 ワード

全列に2人のブログを参考にしてくれてありがとう!
http://blog.sina.com.cn/s/blog_9f7ea4390101101u.html
http://blog.csdn.net/ac_gibson/article/details/45308645
とっくに聞いてたnext_permutationは全配列の強さを生み出し、昨夜まで文字列に全配列の問題に遭遇してやっとこの関数の強さを知った.私たちのチームはdfsに従って全配列をして、それから文字列のマッチングを行って、結果は長く書いて、過程の中でいろいろなdebugを書いた.のそこで今日勉強することにしました...
next_permutation関数
組合せ数学では配列がよく使われますが、ここでは計算シーケンスの全配列の関数を紹介します:next_permutation(start,end)、prev_permutation(start,end).この2つの関数の役割は同じで、違いは前者が現在の配列の次の配列を求め、後者が現在の配列の前の配列を求めることにある.ここでの「前」と「後」については、シーケンスの辞書シーケンスの前後と理解することができ、厳密には、現在のシーケンスpnに対して、彼の次のシーケンスpn+1は、別のシーケンスpmが存在せず、pnを
next_の場合permutation関数、その関数のプロトタイプは:
     #include
     bool next_permutation(iterator start,iterator end)
現在のシーケンスに次の配列が存在しない場合、関数はfalseを返し、そうでなければtrueを返します.
次の例を見てみましょう.
[cpp] view plain copy
#include   
#include   
using namespace std;  
int main()  
{  
    int num[3]={1,2,3};  
    do  
    {  
        cout<" "<" "<
    }while(next_permutation(num,num+3));  
    return 0;  
}  
出力結果:
C++中全排列函数next_permutation 用法_第1张图片
while(next_permutation(num,num+3))の3を2に変更すると、出力は次のようになります.
C++中全排列函数next_permutation 用法_第2张图片
ここから分かるようにnext_permutation(num,num+n)関数は、配列numの最初のn要素を全配列し、num配列の値を変更する.
また、next_permutation()は、使用前に配列したい配列を昇順にソートする必要があります.そうしないと、その配列の後の全配列数しか見つかりません.たとえば、配列numが2,3,1に初期化されると、出力は次のようになります.
C++中全排列函数next_permutation 用法_第3张图片
さらにnext_permutation(node,node+n,cmp)は、構造体numをカスタムソート方式でcmpソートすることができる.
文字に対しても...
next_permutationカスタム比較関数POJ 1256
タイトルに要求される辞書の順序は
//'A'
...
 
 
#include //poj 1256 Anagram
#include
#include
using namespace std;
int cmp(char a,char b) 
{
 if(tolower(a)!=tolower(b))//tolower              .
 return tolower(a)>n;
 while(n--)
{
scanf("%s",ch);
sort(ch,ch+strlen(ch),cmp);
 do
{
printf("%s
",ch); }while(next_permutation(ch,ch+strlen(ch),cmp)); } return 0; }

練習する