题目描述
从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
是一个非常大的数,可能会导致堆栈溢出。