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;} 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号