从 1∼n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式
输入一个整数 n 。
输出格式
每行输出一种方案。
同一行内的数必须升序排列,相邻两个数用恰好 11 个空格隔开。
对于没有选任何数的方案,输出空行。
本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。
数据范围
1≤n≤15
输入样例
3
输出样例
3 2 2 3 1 1 3 1 2 1 2 3
写法一:
边判断,边输出
#include<bits/stdc++.h>
using namespace std;
const int N=15+10;
int a[N];//状态,记录每个位置当前的状态,0表示还没考虑,1表示选它,2表示不选它
int n;
void dfs(int u) { //u表示当前第几位
if(u>n) {
for(int i=1;i<=n;i++) if(a[i]==1) cout<<i<<" ";
cout<<'\n';
return;
}
a[u]=2;
dfs(u+1);//第一个分支,不选
a[u]=0;//恢复现场
a[u]=1;
dfs(u+1);//第二个分支,选
a[u]=0;
}
int main(){
cin>>n;
dfs(1);
return 0;
}
写法二:
判断的同时进行存储,统一输出
#include<bits/stdc++.h>
using namespace std;
const int N=15+10;
int a[N];//状态,记录每个位置当前的状态,0表示还没考虑,1表示选它,2表示不选它
int n;
vector<vector<int>> ways;
void dfs(int u) { //u表示当前第几位
if(u>n) {
vector<int> way;
for(int i=1;i<=n;i++) if(a[i]==1) way.push_back(i);
ways.push_back(way);
return;
}
a[u]=2;
dfs(u+1);//第一个分支,不选
a[u]=0;//恢复现场
a[u]=1;
dfs(u+1);//第二个分支,选
a[u]=0;
}
int main(){
cin>>n;
dfs(1);
for(int i=0;i<ways.size();i++) {
for(int j=0;j<ways[i].size();j++) cout<<ways[i][j]<<" ";
puts("");//等同于cout<<'\n';
}
return 0;
}