buaaoj230——next_permutation的应用

题目地址

简单的全排列输出,借用stl中的next_permutation就非常简单了。

关于next_permutation:(备忘,来源网络)

  1 /*这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<algorithm>
  2 与之完全相反的函数还有prev_permutation*/
  3
  4
  5 //(1) int 类型的next_permutation
  6
  7 int main()
  8 {
  9  int a[3];
 10 a[0]=1;a[1]=2;a[2]=3;
 11  do
 12 {
 13 cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
 14 } while (next_permutation(a,a+3)); //参数3指的是要进行排列的长度
 15
 16 //如果存在a之后的排列,就返回true。如果a是最后一个排列没有后继,返回false,每执行一次,a就变成它的后继
 17
 18
 19 }
 20
 21 输出:
 22
 23  1 2 3
 24  1 3 2
 25  2 1 3
 26  2 3 1
 27  3 1 2
 28  3 2 1
 29
 30
 31 如果改成 while(next_permutation(a,a+2));
 32 则输出:
 33  1 2 3
 34  2 1 3
 35
 36 只对前两个元素进行字典排序
 37 显然,如果改成 while(next_permutation(a,a+1)); 则只输出:1 2 3
 38
 39
 40
 41 若排列本来就是最大的了没有后继,则next_permutation执行后,会对排列进行字典升序排序,相当于循环
 42
 43  int list[3]={3,2,1};
 44 next_permutation(list,list+3);
 45 cout<<list[0]<<" "<<list[1]<<" "<<list[2]<<endl;
 46
 47 //输出: 1 2 3
 48
 49
 50
 51
 52
 53 (2) char 类型的next_permutation
 54
 55 int main()
 56 {
 57  char ch[205];
 58 cin >> ch;
 59
 60 sort(ch, ch + strlen(ch) );
 61 //该语句对输入的数组进行字典升序排序。如输入9874563102 cout<<ch; 将输出0123456789,这样就能输出全排列了
 62
 63  char *first = ch;
 64  char *last = ch + strlen(ch);
 65
 66  do {
 67 cout<< ch << endl;
 68 }while(next_permutation(first, last));
 69  return 0;
 70 }
 71
 72 //这样就不必事先知道ch的大小了,是把整个ch字符串全都进行排序
 73 //若采用 while(next_permutation(ch,ch+5)); 如果只输入1562,就会产生错误,因为ch中第五个元素指向未知
 74 //若要整个字符串进行排序,参数5指的是数组的长度,不含结束符
 75
 76
 77
 78
 79
 80
 81 (3) string 类型的next_permutation
 82
 83 int main()
 84 {
 85  string line;
 86  while(cin>>line&&line!="#")
 87 {
 88  if(next_permutation(line.begin(),line.end())) //从当前输入位置开始
 89 cout<<line<<endl;
 90  else cout<<"Nosuccesor\n";
 91 }
 92 }
 93
 94
 95
 96 int main()
 97 {
 98  string line;
 99  while(cin>>line&&line!="#")
100 {
101 sort(line.begin(),line.end());//全排列
102 cout<<line<<endl;
103  while(next_permutation(line.begin(),line.end()))
104 cout<<line<<endl;
105 }
106 }
107
108
109
110
111
112
113  next_permutation 自定义比较函数
114
115
116 #include<iostream> //poj 1256 Anagram
117 #include<string>
118 #include<algorithm>
119 using namespace std;
120 int cmp(char a,char b) //‘A‘<‘a‘<‘B‘<‘b‘<...<‘Z‘<‘z‘.
121 {
122  if(tolower(a)!=tolower(b))
123  return tolower(a)<tolower(b);
124  else
125  return a<b;
126 }
127 int main()
128 {
129  char ch[20];
130  int n;
131 cin>>n;
132  while(n--)
133 {
134 scanf("%s",ch);
135 sort(ch,ch+strlen(ch),cmp);
136  do
137 {
138 printf("%s\n",ch);
139 }while(next_permutation(ch,ch+strlen(ch),cmp));
140 }
141  return 0;
142 }

本题参考代码:

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 int main()
 5 {
 6     int a[13],l,i;
 7     while(scanf("%d",&l)&&l!=0)
 8     {
 9         for(i=0;i<12;i++)
10             a[i]=i+1;
11     do{
12         for(i=0;i<l;i++)
13             printf("%d",a[i]);
14         printf("\n");
15     }while (next_permutation(a, a + l));
16     printf("\n");
17     }
18 }

/*这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<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-09-30 20:55:25

buaaoj230——next_permutation的应用的相关文章

全排列(next_permutation)

next_permutation函数既可用于非重排列也可用于重排列: #include <bits/stdc++.h>#define MAXN 200000+10#define ll long longusing namespace std; int a[MAXN]; int main(void){    int n;    cin >> n;    for(int i=0; i<n; i++)    cin >> a[i];    sort(a, a+n);  

next_permutation暴力搜索,POJ(3187)

题目链接:http://poj.org/problem?id=3187 解题报告: #include <stdio.h> #include <iostream> #include <algorithm> using namespace std; int main() { int n,sum; scanf("%d%d",&n,&sum); int a[15],b[15]; for(int i=0; i<n; i++) a[i]=i

next_permutation,POJ(1256)

题目链接:http://poj.org/problem?id=1256 解题报告: 1.sort函数是按照ASC11码排序,而这里是按照 'A'<'a'<'B'<'b'<...<'Z'<'z'排序. #include <iostream> #include <algorithm> #include <string> using namespace std; bool cmp(char a,char b) { char m=tolowe

STL next_permutation排列

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

next_permutation函数

转自此处 http://blog.sina.com.cn/s/blog_9f7ea4390101101u.html 这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<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 - 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

《STL源码剖析》--next_permutation函数

STL中提供了2个计算排列组合关系的算法.分别是next_permucation和prev_permutaion. next_permutation是用来计算下一个(next)字典序排列的组合,而prev_permutation用来计算上一个(prev)字典序的排列组合. 字典排序是指排列组合中,按照大小由小到大的排序,例如123的排列组着,字典排序为123,132,213,231,312,321. 看一下next_permutation的实现原理: 从序列的后面向前找,找了两个相邻的元素p[n

STL全排列算法next_permutation和prev_permutation

全排列的问题取决于如何找到"下一个",然后就用同样的方法找到全部的排列 全排列这个问题其实和我们数数:11,12,13,14,15,16,17,18,19,20,21,一样的规律,只不过他的变化只要那固定的几个数自每次都出现,这就导致我们传统的连续整数会在那里丢失一部分:你如何对剩下的这些全排列中的数字看成是"连续的"一列数字,对于"第一个""最小的数字"找到它的"下一个",然后用同样的方法找到再"

STL 源码剖析 算法 stl_algo.h -- next_permutation

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie next_permutation ----------------------------------------------------------------------- 描述: 取得 [first, last) 所标示之序列的下一个排列组合.如果没有,返回 false,有,返回true 思路: 从后往前 1.找两个相邻元素,令左端的元素为*i,右端的元素为*ii,且满足 *i <