HZOJ-235:递归实现指数型枚举(c语言)

题目描述

​ 从1−n这n个整数中随机选取任意多个,每种方案里的数从小到大排列,按字典序输出所有可能的选择方案。

输入

​ 输入一个整数 n。(1≤n≤10)

输出

​ 每行一组方案,每组方案中两个数之间用空格分隔。

​ 注意每行最后一个数后没有空格。

样例输入

3

样例输出

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

样例输入2

4

样例输出2

1
1 2
1 2 3
1 2 3 4
1 2 4
1 3
1 3 4
1 4
2
2 3
2 3 4
2 4
3
3 4
4

代码

// 引入标准输入输出库,这是C++程序的基础库,提供了cin和cout对象用于输入和输出  
#include <iostream>  
// 引入C标准输入输出库,这个库提供了很多基本的输入输出函数,比如atoi,printf等  
#include <cstdio>  
// 引入C标准库,这个库提供了很多基本的函数和数据类型,比如malloc,rand等  
#include <cstdlib>  
// 引入STL的队列容器,队列是一种先进先出(FIFO)的数据结构  
#include <queue>  
// 引入STL的栈容器,栈是一种后进先出(LIFO)的数据结构  
#include <stack>  
// 引入STL的算法库,这个库包含了很多常用的算法,比如排序,查找等  
#include <algorithm>  
// 引入STL的字符串容器,这个容器提供了很多操作字符串的函数和操作符  
#include <string>  
// 引入STL的关联容器map,map是一种关联数组,它将键和值关联在一起  
#include <map>  
// 引入STL的集合容器set,set是一种不允许重复元素的集合  
#include <set>  
// 引入STL的向量容器,向量是一种可变大小的数组  
#include <vector>  
// 使用std命名空间,这样就可以直接使用std下的所有名字,而不需要在前面加上std::  
using namespace std;  
  
// 定义一个长度为10的数组arr  
int arr[10];  
  
// 定义一个函数print_one_result,参数为整数n。该函数用于打印出一个结果  
void print_one_result(int n) {  
    // 对于数组的下标从0到n,打印出对应的元素  
    for (int i = 0; i <= n; i++) {  
        // 如果i不为0(也就是说不是第一项),打印出一个空格字符  
        if (i) cout << " ";  
        // 打印出数组的第i项元素  
        cout << arr[i];  
    }  
    // 打印出一个换行符,表示一行输出结束  
    cout << endl;  
    // 结束函数  
    return ;  
}  
  
// 定义一个函数f,参数为整数i、j和n。该函数用于递归地生成所有可能的数组组合  
void f(int i, int j, int n) {  
    // 如果j大于n,结束函数  
    if (j > n) return ;  
    // 对于从j到n的所有整数k  
    for (int k = j; k <= n; k++) {  
        // 将k赋值给数组的第i项元素  
        arr[i] = k;  
        // 打印出当前的数组组合  
        print_one_result(i);  
        // 递归调用f函数,处理下一个数组元素(也就是arr[i+1])和下一个k值(也就是k+1)以及n不变  
        f(i + 1, k + 1, n);  
    }  
    // 结束函数  
    return ;  
}  
  
// 主函数,程序的入口点  
int main() {  
    // 从标准输入读取一个整数n  
    int n;  
    cin >> n;  
    // 调用函数f,处理数组的第一个元素(也就是arr[0])和第一个k值(也就是1)以及n不变  
    f(0, 1, n);  
    // 返回0,表示程序正常结束  
    return 0;  
}

这是一个 C++ 程序,它使用递归函数来生成一个整数数组的所有可能排列。这个数组的长度由用户输入的整数 n 决定。

程序的主要部分是递归函数 f。这个函数以三个参数作为输入:当前的索引 i,当前的数字 j,以及数组的长度 n

在每次递归调用中,函数会检查当前索引 i 是否超过了数组的长度 n。如果 i 超过了 n,那么函数就会返回,结束这次递归。

如果 i 没有超过 n,那么函数就会在从当前索引 j 到 n 的范围内遍历所有可能的数字,并将这些数字赋值给数组的第 i 个元素。然后它会调用自身,但是这次的索引是 i+1,数字是 k+1(这样在下一次递归中,它可以从下一个位置开始遍历),并且数组的长度仍然是 n

在每次赋值和打印数组后,函数都会打印当前的数组,然后继续下一次递归。

主函数 main 的工作就是读取用户输入的整数 n,然后调用 f 函数,开始生成所有可能的数组排列。

需要注意的是,这个程序没有对输入值进行任何错误检查,所以如果输入的 n 是一个负数或者零,程序可能会出现问题。另外,由于这个程序使用了递归,所以如果 n 是一个非常大的数,可能会导致堆栈溢出。

猜你喜欢

转载自blog.csdn.net/dsafefvf/article/details/132671691