STL风格的全排列函数与子集生成函数。
子集生成代码:
template<class T>
void get_subset(T *left,T *right)
{
//数组的左指针和右指针
static int len=-1;
static bool *pos;
if(len==-1)
{
len=right-left;
pos=new bool[len];
}
//len代表序列长度
if(left==right)
{
for(int i=0; i<len; ++i)
{
if(pos[i])std::cout<<*(right-len+i)<<' ';
}
std::cout<<std::endl;
return;
}
pos[len-(right-left)]=0;
get_subset(left+1,right);
pos[len-(right-left)]=1;
get_subset(left+1,right);
}
枚举全排列:
template<class T>
void get_permutation(T *left,T *right)
{
//数组的左指针和右指针
static int len=-1;
if(len==-1)
{
len=right-left;
}
//len代表序列长度
if(left+1==right)
{
for(T* it=right-len; it!=right; ++it)
{
std::cout<<*it<<' ';
}
std::cout<<std::endl;
return;
}
get_permutation(left+1,right);
for(T* it=left+1; it!=right; ++it)
{
std::swap(*left,*it);
get_permutation(left+1,right);
std::swap(*left,*it);
}
}