您的位置:首页 > 其它

全排列算法(递归实现) 组合算法(递归,位运算实现)

2017-08-23 17:27 337 查看
//……………………………..全排列…………………….

#include<iostream>

using namespace std;

//判断要交换的两个数是否相等,如果相等就不进行交换
bool IsSwap(int list[],int begin,int end)
{
for(int i = begin;i<end;i++)
if(list[i] == list[end])
return false;
return true;
}
void Perm(int list[],int k,int m)
{
if(k == m)
{
for(int i =0;i<m;i++)
cout<<list[i];
cout<<endl;
}
else
{
for(int i = k;i<m;i++)
{
if(IsSwap(list,k,i))
{
swap(list[k],list[i]);
Perm(list,k+1,m); //递归计算k+1到m的全排列
swap(list[k],list[i]);
}
}
}
}
int main()
{
int arr[] = {1,2,2};
cout<<"arr数组全排列的结果是:"<<endl;
Perm(arr,0,3);
return 0;
}


//………………………………….组合算法………………………………

//………………………1.递归方式实现

/*

解题思路:因为要求集合里的元素所能够组成的所有组合,所以我们需要遍历该集合,

这里假设我们的集合为”abc”,从头扫描集合里的元素,第一个元素为a,对于这个元素,

有两种选择,一种是将字符放到组合中,然后在剩下的n-1个字符中选取m-1个字符

另一种是不把字符放到组合中去,接下来需要在剩下的n-1个字符中选取m个字符

*/

#if 1
void Combination(char* string,int number,vector<char>& result)
{
if(number == 0)
{
vector<char>::iterator iter = result.begin();
for(;iter<result.end();++iter)
cout<<*iter;
cout<<endl;
return ;
}

if(*string == '\0')
return ;

result.push_back(*string);
Combination(string+1,number-1,result); //将字符放到组合当中
result.pop_back();
Combination(string+1,number,result);  //不把字符放到组合当中

}
void Combination(char* string)
{
if(string == NULL)
return ;

int length = strlen(string);
vector<char>result;
for(int i = 1;i<=length;++i)
{
Combination(string,i,result);
}
}
int main()
{
char* string = "abcd";
Combination(string);
return 0;
}
#endif


//………………………..2.位运算…………..

分析组合规律可以发现,

当集合个数为2时,有3(2^2-1)种组合方式;

当集合个数为3时,有7(2^3-1)种组合方式;

当集合个数为4时,有15(2^4-1)种组合方式;

又直到1<

#if 1
int main()
{
string s ;
cin>>s;
int len = s.size();
int bit = 1<<len;  //所有组合种类个数
int t;
//两个for循环依次将所有组合情况列举出来
for(int i= 0;i<bit;i++)
{
for(int j = 0;j<len;j++)
{
t = 1<<j;
if((t&i)!=0)
{
cout<<s[j];
}
}
cout<<endl;
}
}
#endif

4000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息