【题目描述】:
监狱里除了修罗王以外,其他的囚犯都喜欢拉帮结派以壮大势力,但拉帮结派并不是无原则的,而是要看发展对象是不是看上去够顺眼,所谓顺眼,即是发展对象拥有的一些个性特征符合帮派的要求。例如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<iostream> #include<algorithm> #include<cstdio> #include<cstring> 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; }