注:为了防止用int在比赛时某些题目因为超出int范围导致得分为0,小白可以直接在最开始将所有int类型define为long long类型,代码中的signed main()相当于int main(),因为在前面将int定义为long long,若用int main()会导致编译错误。
一、递归实现指数型枚举
题目信息
思路
题解
//递归实现指数型枚举
//从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。
#include <bits/stdc++.h>
#define int long long
#define maxsize 100
using namespace std;
int n;
int flag[maxsize];//全局变量和静态变量初始化时会自动设置为0
void dfs(int u)
{
if(u>n){
for(int i=1;i<=n;i++)
{
if(flag[i]==1){
cout<<i<<' ';
}
}
cout<<endl;
return;
}
flag[u]=0;
dfs(u+1);
flag[u]=1;
dfs(u+1);
}
signed main()
{
cin>>n;
dfs(1);
return 0;
}
二、递归实现组合型枚举
题目信息
思路
题解
//递归实现组合型枚举
#include <bits/stdc++.h>
#define int long long
#define maxsize 100
using namespace std;
int n,m;
int number[maxsize];
void dfs(int u,int start)//u指当前的位置,start指从这个数字开始往后列举
{
if(u>m)
{
for(int i=1;i<=m;i++)
{
cout<<number[i]<<" ";
}
cout<<endl;
return ;
}
for(int i=start;i<=n;i++)
{
number[u]=i;
dfs(u+1,i+1);
number[u]=0;
}
}
signed main()
{
cin>>n>>m;
dfs(1,1);
return 0;
}
三、递归实现排列型枚举
题目信息
方法一:根据位置选数字
题解一
//递归实现排列型枚举
#include <bits/stdc++.h>
#define int long long
#define maxsize 100
using namespace std;
int n;
int number[maxsize];
int flag[maxsize];
void dfs(int u)//u代表现在的位置
{
if(u>n){
for(int i=1;i<=n;i++)
{
cout<<number[i]<<" ";
}
cout<<endl;
return;
}
for(int i=1;i<=n;i++)
{
if(flag[i]==0)
{
flag[i]=1;
number[u]=i;
dfs(u+1);
flag[i]=0;
number[u]=0;
}
}
}
signed main()
{
cin>>n;
dfs(1);
return 0;
}
方法二:根据数字选位置
题解二
注:此方法代码未考虑字典序较小的排在前面,后续将会进一步完善
#include <bits/stdc++.h>
#define int long long
#define maxsize 100
using namespace std;
int n;
int number[maxsize];
int flag[maxsize];
void dfs(int u)//u指当前的数字
{
if(u>n)
{
for(int i=1;i<=n;i++)
{
cout<<number[i]<<" ";
}
cout<<endl;
return;
}
for(int i=1;i<=n;i++)
{
if(flag[i]==0)
{
flag[i]=1;
number[i]=u;
dfs(u+1);
flag[i]=0;
number[i]=0;
}
}
}
signed main()
{
cin>>n;
dfs(1);
return 0;
}