咱看y总写的
样例
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=20;
int n;
int s[N];//记录状态(选1,不选2,没考虑过0)
void dfs(int u){//输入枚举到第几位
if(u > n){//达到边界
for(int i=1;i<=n;i++){
if(s[i] == 1) printf("%d ",i);//代码
}
printf("\n");
return;
}
s[u]=2;//标记,未选
dfs(u+1);//选择下一层递归了
s[0]=0;//恢复现场
s[u]=1;//标记,选
dfs(u+1);
s[u]=0;//恢复现场
}
int main(){
cin>>n;
dfs(1);//枚举第1位(刚开始
return 0;
}
储存一下
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
int n;
int s[20];
int vis[1 << 15][20];//记录数组
int cnt;//当前方案的数量
void dfs(int u){
if(u > n){
for(int i=1;i<=n;i++){
if(s[i] == 1) vis[cnt][i]=i;
}
cnt++;
return;
}
s[u]=2;//标记,未选
dfs(u+1);//选择下一层递归了
s[0]=0;//恢复现场
s[u]=1;//标记,选
dfs(u+1);
s[u]=0;//恢复现场
}
int main(){
cin>>n;//输入
dfs(1);
for(int i=0;i<cnt;i++){
for(int j=1;j<=n;j++)
if(vis[i][j] != 0)
printf("%d ",vis[i][j]);
printf("\n");
}
return 0;
}
判断一下,非0的输出