buaaoj230——next_permutation的应用
Posted 惜取少年时
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}
以上是关于buaaoj230——next_permutation的应用的主要内容,如果未能解决你的问题,请参考以下文章