【题目描述】:
监狱里除了修罗王以外,其他的囚犯都喜欢拉帮结派以壮大势力,但拉帮结派并不是无原则的,而是要看发展对象是不是看上去够顺眼,所谓顺眼,即是发展对象拥有的一些个性特征符合帮派的要求。例如N=3,表示符合帮派的个性特性共有3个,假设以a、b、c定义,我们称(a,b,c)为集合S,而发展对象只要拥有其中的一个或多个特征都会被帮派选中,即符合子集(S)={(),(a),(b),(c),(a,b),(b,c),(a,c),(a,b,c)}中的任何一个均可。当然,你可能要问了,这空集没有任何特征也符合条件?对啊,“和光同尘”也是一种很受大家欢迎的生活态度啊。
现输入N,求(S)的子集。
【输入描述】:
一个整数即N。
【输出描述】:
按字典序输出所有子集,每个子集占一行。
【样例输入】:3
【样例输出】:()
(a)
(ab)
(abc)
(ac)
(b)
(bc)
(c)
【时间限制、数据范围及描述】:
时间:1s 空间:64M
30%的数据:N<=6
50%的数据:N<=15
100%的数据:0<=N<=21
#include
#include
#include
#include
using namespace std;
int n;
char a[21];
void dfs(int aa,int s) {
if(s==n){return;}
for(int j=aa+1;j<=n;j++){
a[s+1]='a'+j-1;
printf("(");
for(int k=1;k<=s+1;k++){
printf("%c",a[k]);
}
printf(")\n");
dfs(j,s+1);
}
}
int main() {
scanf("%d",&n);
printf("()\n");
for(int i=1; i<=n; i++) {
a[1]='a'+i-1;
printf("(%c)\n",'a'+i-1);
dfs(i,1);
}
return 0;
}