解题思路:
根据子集的定义,集合中的每一个元素在子集中都有两种状态:‘1’表示出现,'0'表示不出现;如果所有的元素都不出现,则该子集是空集,
如果所有的元素都出现,则该子集是全集。
我们定义一个标记数组tag,用于记录集合中对应的元素是否出现,每层遍历对应集合中的每个元素,都有出现(为‘1’)和不出现(为‘0’)
两种可能,一直遍历到所有的元素的可能都标记完,然后根据数组函数输出结果。
#include <iostream>
using namespace std;void build(char *str,int *tag,int n)
{
if(n==5)
{
cout<<"{";
for(int i=0;i<5;i++)
if(tag[i]==1)
cout<<str[i];
cout<<"}"<<endl;
return;
}
tag[n] = 0;
build(str,tag,n+1);
tag[n] = 1;
build(str,tag,n+1);
}
int main()
{
char a[5]={'a','b','c','d','e'};
int tag[5];
build(a,tag,0);
return 0;
}
输出结果如下:
类似的还有实现整数的全排列,实现方法如下:
#include<iostream>
using namespace std;
int sum=0;
inline void Swap(int& a,int& b)
{
int temp=a;
a=b;
b=temp;
}
void Perm(int list[],int k,int m)
{//生成list[k:m]的所有的排列方式
int i;
//输出一个排列方式
if (k==m)
{
for (i=0;i<=m;i++)
cout<<list[i]<<' ';
sum++;
cout<<endl;
}
else
//list[k:m]有多种排列方式
//递归的产生这些排列方式
for (i=k;i<=m;i++)
{
Swap(list[k],list[i]);
Perm(list,k+1,m);
Swap(list[k],list[i]);
}
}
int main()
{
//数组元素要不同,否则,全排列还有问题。
int l[4]={3,5,7,9};
cout<<"全排列如下:"<<endl;
Perm(l,0,3);
cout<<"总数目为:"<<sum<<endl;
}
希望能够对初学者有所帮助,谢谢!!