【C语言】随机选数

相信你是最棒哒!!!

目录

一、递归实现指数型枚举

输入格式

输出格式

二、题目代码


一、递归实现指数型枚举

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

输入格式

输入一个整数n。

输出格式

每行输出一种方案。

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

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

本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。

输入样例  3

输出样例 

3

2

2 3

1

1 3

1 2

1 2 3


二、题目代码

注释版

#include 

int n;
int st[20]; // 用于标记每个位置是否被选择,1表示选择,0表示不选择

// 定义递归函数dfs,用于生成所有子集
void dfs(int x) {
    // 如果x大于n,说明已经处理完所有位置
    if (x > n) {
        // 遍历数组st,输出当前子集
        int first = 1; // 用于标记是否是第一个输出的数字
        for (int i = 1; i <= n; i++) {
            // 如果位置i被选择,则输出i
            if (st[i] == 1) {
                if (first) {
                    printf("%d", i); // 第一个数字直接输出
                    first = 0; // 标记已输出第一个数字
                } else {
                    printf(" %d", i); // 后续数字前加空格
                }
            }
        }
        printf("\n"); // 换行,表示一个子集的结束
        return; // 返回上一层递归
    }

    // 不选择当前位置x
    st[x] = 0; // 标记当前位置为不选择
    dfs(x + 1); // 递归处理下一个位置

    // 选择当前位置x
    st[x] = 1; // 标记当前位置为选择
    dfs(x + 1); // 递归处理下一个位置
    st[x] = 0;  // 恢复现场,将当前位置标记为未选择
}

int main() {
    scanf("%d", &n); // 从标准输入读取集合的大小n
    dfs(1); // 从位置1开始递归生成所有子集
    return 0; // 程序正常结束,返回0
}

简洁版

#include 
#include
int n;
int st[20];
void dfs(int x) {
    if (x > n)
    {
        for (int i = 1; i <= n; i++)
        {
            if (st[i] == 1)
                printf("%d ", i);
        }
        printf("\n");
        return ;
    }
    //不选
    st[x] = 2;
    dfs(x + 1);
    st[x] = 0;  //恢复现场

    //选
    st[x] = 1;
    dfs(x + 1);
    st[x] = 0;
   
}
int main() {
    scanf("%d", &n);
    dfs(1);
    return 0;
}

你可能感兴趣的:(深度优先,图论,算法,c语言,学习,开发语言)