在c++的标准库STL中,next_permutation()函数用于查找序列的完整排列。
函数原型:
模板<class BidirectionalIterator >
Boolnext_permutation(
BidirectionalIterator_First。
BidirectionalIterator_Last
);
<class BidirectionalIterator, classBinaryPredicate >
Boolnext_permutation(
BidirectionalIterator_First。
BidirectionalIterator_Last,
BinaryPredicate_Comp
);
两个重载函数,第二个具有谓词参数_Comp,其中只有两个参数的版本,默认谓词函数是“小于”。
返回值:Bool类型(如果当前数组是列表中的最后一个,则为false)
例1(int):
Intmain(){
Inta[]={3,1,2};
{橘此做
Cout <<[0] <<" " <<[1] <<”“<<[2] <<endl
}while(next_permutation(a,a+3));
返回0;
}
输出:312/321,因为原始序列没有以最小的字典排列开始。
所以你想要得到所有的排列
Inta[]={3,1,2};A[]={1,2,3};
例2(字符串)
Intmain(){
字符串STR。
Cin >>STR。
Sort(STR.Thebegin(),STR.End())敏铅;
{做
Cout <<STR <<endl
}while(next_permutation(STR.Thebegin(),STR.Theend()));
返回0;
}
扩展资料:
注意事项:
函数三要素:自变量、因变量、对应规则。
(1)自变量(函数):一个智与其数量有关,这个数量中的任何一个值都可以在其他数量中找到圆拿迅相应的固定值。
(2)因变量(函数):因变量(函数)随着自变量的变化而变化,当自变量取唯一值时,因变量(函数)有且只有与之对应的唯一值。
(3)对应规则是功能的三个要素之一。一般来说,在函数符号y=f(x)中,“f”是对应的规则,方程y=f(x)表明,对于定义域内的任意x值,在对应规则“f”的作用下,可以得到上域中唯一的y值。
/*这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<algorithm>与之完全相反的函数还有prev_permutation*/
//(1) int 类型的next_permutation
int main()
{
int a[3]
a[0]=1a[1]=2a[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)) 如果只输入1562,就会产生错误,因为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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)