- 递归实现排列类型枚举 II
https://www.acwing.com/problem/content/description/1539/ - 递归实现指数型枚举 II
https://www.acwing.com/problem/content/submission/code_detail/1314312/ - 递归实现组合型枚举 II
https://www.acwing.com/problem/content/1575/
好哥哥们
每次递归开一个bool数组 防止重复
没有任何技术含量哈哈
总结 :
1.结果要求升序,则从前往后遍历,用start存储当前进度
2.结果不要求升序,用 遍历二进制第一个0位 开启递归入口
虽然都是简单题,但是做出来还是开心地哇哇叫啊,哈哈
//1537. 递归实现排列类型枚举 II
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int q[11];
int n;
vector<int> temp;
void dfs(int num,int a)
{
if(num==n)
{
for(auto i:temp)
cout<<q[i]<<' ';
cout<<endl;
return ;
}
bool m[10];
memset(m,false,sizeof m);
for(int i=0;i<n;i++)
{
if(!(a>>i&1))
{
if(!m[q[i+1]])
{ temp.push_back(i+1);
dfs(num+1,a|(1<<i));
temp.pop_back();
m[q[i+1]]=true;
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>q[i];
sort(q,q+n+1);
;
dfs(0,0);
return 0;
}
//1572. 递归实现指数型枚举 II
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
int n;
int q[50];
vector<vector<int>> w;//二维数组,也可以用哈希表
vector<int > temp;
void dfs(int start)
{
if(start==n)
{
for(auto i:temp)
{
cout<<i<<' ';
}
cout<<endl; return ;
}
dfs(start+1);
for(auto i:w[start])
{
temp.push_back(i);
dfs(start+1);
}
for(auto i:w[start])
temp.pop_back();
//回溯的想法,恢复现场
//每组取0个取1个取2个;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{cin>>q[i];}
sort(q,q+n);
for(int i=0;i<n;i++)
{ if(w.empty()||q[i]!=q[i-1])
w.push_back({q[i]});
else
w.back().push_back(q[i]);
}
n=w.size();
dfs(0);
return 0;
}
//1573. 递归实现组合型枚举 II
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m;
int q[50];
vector<int> temp;
void dfs(int num,int start)
{
if(num==m)
{
for(auto i:temp)
{
cout<<i<<' ';
}
cout<<endl;return ;
}
if(start>=n) return ;
bool visit[50];
memset(visit,false,sizeof visit);
for(int i=start;i<n;i++)
{
if(!visit[q[i]])
{
temp.push_back(q[i]);
dfs(num+1,i+1) ;
temp.pop_back();
visit[q[i]]=true;
}
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>q[i];
sort(q,q+n);
dfs(0,0);
return 0;
}