传送门
这道题,反正大佬都说是水题,题解是很好写的。但是我硬是看了好久才明白一丝丝
#include<iostream>
#include<vector>
using namespace std;
int n=0;
vector<int > num;
void dfs(int k){
if(k==n+1){
for(int i =0;i<num.size();i++){
cout<<num[i]<<' ';
}cout<<endl;
return;
}
dfs(k+1);// #1
num.push_back(k);
dfs(k+1);// #2
num.pop_back();
}
int main()
{
cin>>n;
dfs(1);
return 0;
}
直接看dfs,判断条件很明显,也好理解,当k==n+1时候,顺序输出num数组里的值。
两个dfs函数都是一样的,不过#1处的dfs在每次第一次访问的时候,都是直接低轨道下一层的,只有#2处的dfs才可以帮助num数组记住当前值,所以也可以理解为,#1 dfs是不选的值,#2 dfs是要选的值。最后一行pop也是可以理解的,就是还原现场嘛。感觉这个方法可以记下来当作模板,感觉有点类似树的递归遍历。不知道是怎么想出来这样解的。