枚举子集
题目描述
今有 n n n 位同学,可以从中选出任意名同学参加合唱。
请输出所有可能的选择方案。
输入格式
仅一行,一个正整数 n n n。
输出格式
若干行,每行表示一个选择方案。
每一种选择方案用一个字符串表示,其中第
i
i
i 位为 Y
则表示第
i
i
i 名同学参加合唱;为 N
则表示不参加。
需要以字典序输出答案。
样例 #1
样例输入 #1
3
样例输出 #1
NNN
NNY
NYN
NYY
YNN
YNY
YYN
YYY
提示
对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 10 1\leq n\leq 10 1≤n≤10。
深度优先搜索(DFS)学习:
参考代码
#include <stdio.h>
// 深度优先搜索(DFS)
void dfs(int n, char s[], int idx){
if (idx == n) {
for(int i = 0; i < n; i++){
printf("%c", s[i]);
}
printf("\n");
return;
}
// 向下递归处理下一位
s[idx] = 'N'; // 第一位为N
dfs(n, s, idx + 1);
s[idx] = 'Y'; // 第一位为Y
dfs(n, s, idx + 1);
}
int main() {
int n; // 设置二进制位数
scanf("%d", &n);
char s[n + 1];
s[n] = '\0'; // 字符串结束标志
dfs(n, s, 0); // 从第0位开始深度优先搜索()
return 0;
}