题目:
从 1?n 这 nn个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式
输入一个整数 nn。
输出格式
每行输出一种方案。
同一行内的数必须升序排列,相邻两个数用恰好 1 个空格隔开。
对于没有选任何数的方案,输出空行。
本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。
数据范围
1≤n≤15
输入样例:
3
输出样例:
3 2 2 3 1 1 3 1 2 1 2 3
很明显这是递归三大类型之一:指数型枚举
所以我们可以有递归搜索树来实现,对于 1~n 中的每一个数,它都有两种情况:选了或没选。所以以此我们可以建立一个递归搜索树。
思路:
对于递归不熟练可以画对应的递归搜索树
按照**每个位置**考虑,每个位置有**三种状态**:未考虑、不填、填
对此可以用数组才存取每个位置的状态:未考虑为0,不填为2,填为1
对于状态改变注意恢复现场,这题因为状态会被覆盖所以可以不用恢复现场
代码实现:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;int st[16]; //记录状态,0-没考虑,1-选了,2-没选。
int N;void dfs(int n)
{if(n > N) //设置边界,输出。{for(int i = 1; i <= n; ++i)if(st[i] == 1) printf("%d ",i);printf("\n");return;}//st[n] = 2; //第一个分支--没选dfs(n + 1); //调用自己--进入下一个分支st[n] = 0; //回溯时要还原st[n] = 1; //第二个分支--选了dfs(n + 1);st[n] = 0;
}int main()
{cin >> N;dfs(1);return 0;
}