题目描述
思路分析
DFS基础
DFS思考:搜索顺序和需要的参数。
记录答案可以二进制存,或者直接开全局path数组。
代码实现
//递归实现指数型枚举
#include<bits/stdc++.h>
using namespace std;
int n;
void dfs(int u,int state){
if(u==n){
for(int i=0;i<=n-1;i++){
if(state>>i&1) cout<<i+1<<" ";
}
cout<<endl;
return;
}
dfs(u+1,state);
dfs(u+1,state+(1<<u));
}
int main(){
cin>>n;
dfs(0,0);
return 0;
}
//递归实现组合型枚举
#include<bits/stdc++.h>
using namespace std;
const int N=30;
bool st[N];
vector<int> path;
int n,m;
void dfs(int u,int k){
if(u==n+1&&k) return;
if(k==0){
for(int i=0;i<path.size();i++) cout<<path[i]<<" ";
cout<<endl;
return;
}
path.push_back(u);
dfs(u+1,k-1);
path.pop_back();
dfs(u+1,k);
return;
}
int main(){
cin>>n>>m;
dfs(1,m);
return 0;
}
//递归实现排列型枚举
#include<bits/stdc++.h>
using namespace std;
const int N=15;
int n;
vector<int> path;
bool st[N];
void dfs(int u){
if(u==n+1){
for(int i=0;i<n;i++) cout<<path[i]<<" ";
cout<<endl;
return;
}
for(int i=1;i<=n;i++){
if(!st[i]){
path.push_back(i);
st[i]=true;
dfs(u+1);
path.pop_back();
st[i]=false;
}
}
}
int main(){
cin>>n;
dfs(1);
return 0;
}
另外,组合型枚举还有另一种思路:点这里查看另一种思路