从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式
输入一个整数n。
输出格式
每行输出一种方案。
同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。
对于没有选任何数的方案,输出空行。
本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。
数据范围
1≤n≤15
输入样例:
3
输出样例:
3
2
2 3
1
1 3
1 2
1 2 3
思路:
- 虽然暴力做法可以实现,但是位运算+深度优先搜索为本题的最优解
代码:
#include <iostream>
using namespace std;
int n;
void dfs(int u, int state) //递归函数
{
if (u == n) //当遍历到末尾时结束
{
for (int i = 0; i < n; i ++ )
if (state >> i & 1) //判断:状态值为1 时执行输出;
cout << i + 1 << ' ';
cout << endl;
return;
}
//该点遍历结束后转向下一点 ,根据该点状态是否记为1分为两类;
dfs(u + 1, state);
dfs(u + 1, state + (1 << u));
}
int main()
{
cin >> n;
dfs(0, 0);
return 0;
}
来源:CSDN
作者:zhr_the_great
链接:https://blog.csdn.net/zhr_the_great/article/details/104618110