next_permutation

来源:互联网 发布:伴随矩阵的特征值 编辑:程序博客网 时间:2024/05/22 04:44



这是一个求一个排序的下一个排列的函数,可以遍历全排列

,

要包含头

文件

<algorithm> 

下面是以前的笔记

 

   

与之完全相反的函数还有

prev_permutation 

  

  

(1) int 

类型的

next_permutation 

  

int main() 

 int a[3]; 

a[0]=1;a[1]=2;a[2]=3; 

 do 

cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl; 

} while (next_permutation(a,a+3)); //

参数

3

指的是要进行排列的长度

 

  

//

如果存在

a

之后的排列,就返回

true

。如果

a

是最后一个排列没有后

继,返回

false

,每执行一次,

a

就变成它的后继

 

  

  

  

输出:

 

  

 1 2 3 

 1 3 2 

 2 1 3 

 2 3 1 

 3 1 2 

 3 2 1 

  

  

如果改成

 

while(next_permutation(a,a+2)); 

则输出:

 

 1 2 3 

 2 1 3 

  

只对前两个元素进行字典排序

 

显然,如果改成

 

while(next_permutation(a,a+1)); 

则只输出:

1 2 3 

  

  

  

若排列本来就是最大的了没有后继,

next_permutation

执行后,

会对

排列进行字典升序排序

,

相当于循环

 

  

 int list[3]={3,2,1}; 

next_permutation(list,list+3); 

cout<<list[0]<<" "<<list[1]<<" "<<list[2]<<endl; 

  

//

 输出

: 1 2 3 

 

  

  

  

  

(2) char 

类型的

next_permutation 

  

int main() 

 char ch[205]; 

cin >> ch; 

  

sort(ch, ch + strlen(ch) ); 

//

该语句对输入的数组进行字典升序排序。

如输入

9874563102 cout<<ch; 

将输出

0123456789,

这样就能输出全排列了

 

  

 char *first = ch; 

 char *last = ch + strlen(ch); 

  

 do { 
























cout<< ch << endl; 

}while(next_permutation(first, last)); 

 return 0; 

  

//

  

这样就不必事先知道

ch

的大小了,是把整个

ch

字符串全都进行排序

 

//

若采用

 

while(next_permutation(ch,ch+5)); 

如果只输入1 562

,就会产

生错误,因为

ch

中第五个元素指向未知

 

//

若要整个字符串进行排序,参数

5

指的是数组的长度,不含结束符

 

  

  

(3) string 

类型的

next_permutation 

  

int main() 

 string line; 

 while(cin>>line&&line!="#") 

 if(next_permutation(line.begin(),line.end())) //

      从当前输入位置开始

 

cout<<line<<endl; 

 else cout<<"Nosuccesor\n"; 

  

  

  

int main() 

 string line; 

 while(cin>>line&&line!="#") 

sort(line.begin(),line.end());//

     全排列

 

cout<<line<<endl;

while(next_permutation(line.begin(),line.end())) 

cout<<line<<endl; 

  

  

  

  

  

  

 next_permutation 

自定义比较函数

 

  

  

#include<iostream> //poj 1256 Anagram 

#include<string> 

#include<algorithm> 

using namespace std; 

int cmp(char a,char b) //'A'<'a'<'B'<'b'<...<'Z'<'z'. 

 if(tolower(a)!=tolower(b)) 

 return tolower(a)<tolower(b); 

 else 

 return a<b; 

int main() 

 char ch[20]; 

 int n; 

cin>>n; 

 while(n--) 

scanf("%s",ch); 

sort(ch,ch+strlen(ch),cmp); 

 do 

printf("%s\n",ch); 

}while(next_permutation(ch,ch+strlen(ch),cmp)); 

 return 0; 

}

 

 

以上全部复制粘贴自  百度文库,链接  如下:   https://wenku.baidu.com/view/ef6bf1b67fd5360cbb1adb97.html     仅作收藏之用。
0 0