Permutation_Combination_C++

[root@node ~]# cat permutation_combination.cpp  
#include <vector>
#include <iostream>
usingnamespace std;
class sequence
{
public:
void show(int);
      sequence(int, int);
void seq(int, char);
void swap(int&, int&);
void combination(int, int);
void permutation(int, int, int p=0);
protected:
int len;
      vector<int> per, com;
};
void sequence::show(int k)
{
for (int i=0; i!=len-1; ++i)
        cout<<(k?per[i]:per[com[i]])<<".";
   cout<<(k?per[len-1]:per[com[len-1]])<<endl;
}
sequence::sequence(int p, int q)
{
   len=q;
for(int i=0; i!=p; ++i)
       per.push_back(i+1);
   com.assign(q, 0);
}
void sequence::seq(int m, char c)
{
switch (c)
   {
case'c' : combination(m,len); break;
case'p' : permutation(m,len); break;
   }
}
void sequence::swap(int& i, int& j)
{
int t=i;
       i=j;
       j=t;
}
void sequence::combination(int n ,int m)
{
for (int i=n; i>=m; --i)
   {
       com[m-1]=i-1;
if (m > 1)
           combination(i-1, m-1);
else
           show(0);
   }
}
void sequence::permutation(int m, int n, int p) 
{
if ( n == 0 ) show(1);
for (int i=p; i!=p+m; ++i) 
   {
        swap(per[i], per[p]);
        permutation(m-1, n-1, p+1);
        swap(per[i], per[p]);
   }
}
int main(int argc, char* argv[]) 
{
int p=stoi(argv[1]);
int q=stoi(argv[2]);
   sequence pm(p,q);
   pm.seq(p, *argv[3]);
return 0;
}
[root@node ~]# g++ -std=c++11 -s -o t permutation_combination.cpp   
[root@node ~]# ./t 4 3 c 
1.2.3  
1.2.4  
1.3.2  
1.3.4  
1.4.3  
1.4.2  
2.1.3  
2.1.4  
2.3.1  
2.3.4  
2.4.3  
2.4.1  
3.2.1  
3.2.4  
3.1.2  
3.1.4  
3.4.1  
3.4.2  
4.2.3  
4.2.1  
4.3.2  
4.3.1  
4.1.3  
4.1.2  
[root@node ~]# ./t 3 2 p 
1.2 
1.3 
2.1 
2.3 
3.2 
3.1


本文出自 “永夜” 博客,谢绝转载!

你可能感兴趣的:(Algorithm,C++,permutation)