92. 递归实现指数型枚举
解法一:采用dfs,填坑,从填1个坑到填n个坑。
坑可以随便填,比如第1个坑选了2之后,第2个坑可以填1(非升序),也可以填3(升序)
#include<bits/stdc++.h>
using namespace std;
int n;
bool vis[20];//标记是否取过
int a[20];//储存答案
//一共有tra个坑,第pos个坑填数,从start开始完成升序
void dfs(int pos,int tra,int start){
if(pos>tra){
for(int i=1;i<=tra;i++) cout << a[i] << ' ';
cout << endl;
return;
}
for(int i=start;i<=n;i++){
if(!vis[i]){
vis[i]=true;
a[pos]=i;
dfs(pos+1,tra,i);
vis[i]=false;
}
}
}
int main(){
cin >> n;
cout << endl;
for(int i=1;i<=n;i++){//坑的个数
dfs(1,i,1);
}
return 0;
}
当然,可以还有一种更简单的方法,那就是采用二进制代替!!
#include<bits/stdc++.h>
using namespace std;//用二进制代表取不取
int n;
bool vis[20];
int a[20];
void Binary(int n){
for(int i=1;i<(1<<n);i++){
int pos=0;
int a=i;
while(a){
pos++;
if(a&1) cout << pos << ' ';
a>>=1;
}
cout << endl;
}
}
int main(){
cin >> n;
cout << endl;//表示不取的情况
Binary(n);
return 0;
}
93. 递归实现组合型枚举
这题与第一题很类似,递归求解即可
#include<bits/stdc++.h>
using namespace std;
int n,m;
int cnt[30];
bool vis[30];
void dfs(int pos,int str,int start){
if(pos>str){
for(int i=1;i<=m;i++) cout << cnt[i] << ' ';
cout << endl;
return ;
}
for(int i=start;i<=n;i++){
if(!vis[i]){
vis[i]=true;
cnt[pos]=i;
dfs(pos+1,str,i);
vis[i]=false;
}
}
}
int main(){
cin >> n >> m;
dfs(1,m,1);
return 0;
}
这里二进制做法不可取,因为会超时!!
/*
#include<bits/stdc++.h>
using namespace std;
int n,m;
void Binary(int n,int m){//二进制TLE
string s[30];
int count=0;
for(int i=1;i<(1<<n);i++){
int a=i;
int pos=0;
string ss="";
while(a){
pos++;
if(a&1){
stringstream sss;
sss<<pos;
string c;
sss>>c;
ss+=c;
}
a>>=1;
}
if(ss.size()==m){
s[++count]=ss;
}
}
sort(s+1,s+count+1);
for(int i=1;i<=count;i++){
for(int j=0;j<s[i].size();j++){
printf("%c ",s[i][j]);
// cout << s[i][j] << ' ';
}
printf("\n");
// cout << endl;
}
}
int main(){
scanf("%d%d",&n,&m);
Binary(n,m);
return 0;
}
*/
接下里我们运用dfs来实现全排列
#include<bits/stdc++.h>
using namespace std;
int n;
int cnt[10];
bool vis[10];
void dfs(int pos,int tra){
if(pos>n){
for(int i=1;i<=n;i++) cout << cnt[i] << ' ';
cout << endl;
return ;
}
for(int i=1;i<=n;i++){
if(!vis[i]){
vis[i]=true;
cnt[pos]=i;
dfs(pos+1,tra);
vis[i]=false;
}
}
}
int main(){
cin >> n;
dfs(1,n);
return 0;
}