prev_permutation 函数

这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<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)); 如果只输入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;

}

时间: 2024-10-15 06:37:39

prev_permutation 函数的相关文章

[OI - STL] next_permutation( ) &amp; prev_permutation( )函数

next_permutation( ) 和 prev_permutation( ) 函数基本类似,都需要用到头文件名<algorithm> next_permutation()函数 用法:next_permutation(first,last) 作用:next_permutation()函数将 [ first , last ] 区间中的序列转换为字典序的下一个排列.如果下一个排列存在返回true,如果下一个排列不存在(即区间中包含的是字典序的最后一个排列),则该函数返回false,并将区间转换

STL具体操作之next_permutation和prev_permutation函数

 next函数默认的是从小到大的顺序,pre函数默认的是从大到小的顺序: {3,1,2}用next得到的结果是{3,1,2}和{3,2,1}: 用pre得到的结果是{3,1,2},{2,3,1},{2,1,3},{1,3,2,},{1,2,3}: 原理如下: [STL]next_permutation的原理和使用 1.碰到next_permutation(permutation:序列的意思) 今天在TC上碰到一道简单题(SRM531 - Division Two - Level One),是

STL next_permutation和prev_permutation函数

利用next_permutation实现全排列升序输出,从尾到头找到第一个可以交换的位置, 直接求到第一个不按升序排列的序列. 1 #include <iostream> 2 #include <algorithm> /// next_permutation, sort 3 #define MAX 100 4 using namespace std; 5 6 int main() { 7 int myints[MAX],n; 8 cin >> n; 9 for (int

prev_permutation()和next_permutation()

1. next_permutation(): next_permutation()函数的返回类型是bool类型. 即:如果有一个更高的排列,它重新排列元素,并返回true:如果这是不可能的(因为它已经在最大可能的排列),它按升序排列重新元素,并返回false. 使用: next_permutation,重新排列范围内的元素[第一,最后一个)返回按照字典序排列的下一个值较大的组合. next_permutation()函数功能是输出所有比当前排列大的排列,顺序是从小到大. 算法描述: 从尾部开始往

STL next_permutation排列

概念 全排列的生成算法有很多种,有递归遍例,也有循环移位法等等.C++/STL中定义的next_permutation和prev_permutation函数则是非常灵活且高效的一种方法,它被广泛的应用于为指定序列生成不同的排列.本文将详细的介绍prev_permutation函数的内部算法. 按照STL文档的描述,next_permutation函数将按字母表顺序生成给定序列的下一个较大的序列,直到整个序列为减序为止.prev_permutation函数与之相反,是生成给定序列的上一个较小的序列

A - Next_permutation

首先介绍一下next_permutation函数的用途! 按照STL文档的描述,next_permutation函数将按字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止. prev_permutation函数与之相反,是生成给定序列的上一个较小的排列. 代码如下 #include<iostream> #include<algorithm> using namespace std; int main() { int a[] = {3,6,4,2}; do{ cout

next_permutatio

next_permutation的函数声明:#include  <algorithm> bool next_permutation( iterator start, iterator end);   next_permutation函数的返回值是布尔类型,在STL中还有perv_permutation()函数 #include <iostream> #include <algorithm> #include <string> using namespace

UVALive 6163(暴力枚举)

这道题我的做法就是枚举这四个数的所有排列所有运算所有计算顺序. 略有考验代码能力,不能漏掉情况,注意模块化的思想,一些功能写成函数调试的时候结构清晰好分析. 比赛时没有AC是对next_permutation()函数理解的不透,根本没有想到是没有从最小字典序开始枚举的问题. 就是next_permutation()函数是从当前顺序枚举到字典序最大的,而我开始时do里面的a数组不一定是字典序最小的,但是next_permutation()函数一定是从当前字典序往最大的枚举,所以漏掉了字典序很小的那

nyist oj 19 擅长排列的小明(dfs搜索+STL)

擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长.现在需要你写一个程序来验证擅长排列的小明到底对不对. 输入 第一行输入整数N(1<N<10)表示多少组测试数据, 每组测试数据第一行两个整数 n m (1<n<9,0<m<=n) 输出 在1-n中选