(1)全排列问题
1 //全排列的两种方法 2 #include <iostream> 3 using namespace std; 4 5 //方法一,采用swap方法 6 void quanpailie(char * A,int first,int n) 7 { 8 if(A==NULL) 9 { 10 cout<<"A is NULL"<<endl; 11 return; 12 } 13 if(n<=1) 14 { 15 cout<<A<<endl; 16 return; 17 } 18 for(int i=first;i<first+n;i++) 19 { 20 swap(A[i],A[first]); 21 quanpailie(A,first+1,n-1); 22 swap(A[i],A[first]); 23 } 24 return; 25 } 26 27 //采用字典序全排序,就是采用的字典排序思想,从后向前找出第一个A[i]<A[i+1],如果没有就说明结束, 28 //然后在从右向左找出第一个大于A[i]的,进行交换,然后逆序i+1到最后(也就是逆序j到最后)。 29 void quanpailie2(char * A,int n) 30 { 31 cout<<A<<endl; //输出最开始的“abc” 32 if(A==NULL||n<=0) 33 return; 34 while(true) 35 { 36 int i; 37 for(i=n-2;i>=0;i--) 38 { 39 if(A[i]<A[i+1]) 40 break; 41 } 42 if(i<0) 43 { 44 break; 45 } 46 for(int k=n-1;k>=0;k--) 47 { 48 if(A[k]>A[i]) 49 { 50 swap(A[i],A[k]); 51 break; 52 } 53 } 54 reverse(A+i+1,A+n); 55 cout<<A<<endl; 56 } 57 } 58 59 int main() 60 { 61 char A[]="1234"; 62 //quanpailie(A,0,4); 63 quanpailie2(A,4); 64 system("pause"); 65 }
(2)组合问题
。。。。。
原文:http://www.cnblogs.com/zmlctt/p/3848115.html