您的位置:首页 > 其它

buaaoj230——next_permutation的应用

2016-11-29 20:26 274 查看
题目地址

简单的全排列输出,借用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 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: