递归实现指数类型枚举

【问题描述】
从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。

【输入格式】
输入一个整数n。

【输出格式】
每行输出一种方案。

同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。

对于没有选任何数的方案,输出空行。

各行(不同方案)之间的顺序任意。

【数据范围】
1 ≤ n ≤ 15

【输入样例】
3

【输出样例】

3
2
2 3
1
1 3
1 2
1 2 3


题解:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 15;

int n;
int st[N]; //状态,记录每个位置当前的状态:0表示还没考虑,1表示选它,2表示不选它

void dfs(int step)
{
    if(step == n + 1)
    {
        for(int i = 1 ; i <= n ; i ++)
        {
            if(st[i] == 1) cout << i  << " ";
        }
        puts("");
        return;
    }
    
    // 第一个分支:选
    st[step] = 1;
    dfs(step + 1);
    st[step] = 0;
    
    // 第二个分支:不选
    st[step] = 2;
    dfs(step + 1);
    st[step] = 0;
}
int main()
{
    cin >> n;
    dfs(1);
    return 0;
}
发布了63 篇原创文章 · 获赞 5 · 访问量 828

猜你喜欢

转载自blog.csdn.net/weixin_46239370/article/details/105325879