#436. 求子集

扫码查看

【题目描述】:

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

  

12-28 08:52
查看更多