思路
采用递归,从1~n依次考虑每一位数是否被选中输出
注意
①只有每一位考虑完才会有输出,即只会在最底层遍历完进行方案输出(回溯)
②每一层回溯完要恢复现场,变成每一次递归调用前的状态,方便同一层不同分支之间递归与回溯互不干扰
③dfs函数产生输出的条件是m==n+1而不是m==n,要确保最后一位数的情况也被选择完,在此之后才能输出完整的一种方案
代码
方案一:
#include<iostream>
#include<cstdio>
using namespace std;
int n;
const int N = 20;
int st[N];
void dfs(int m) //从第几位上的数开始递归
{
//如果递归完最后一层(第1到n位的数全部判断完选择),输出方案结果
if(m > n)
{
for(int i = 1; i <= n; i++)
if(st[i] == 1)
printf("%d ",i);
printf("\n");
return;
}
//不是最后一层时,表示遍历到第m位上的数,有选择/不选择两种情况
//不选择
st[m] = 0;
dfs(m+1);
st[m] = 0;
//选择
st[m] = 1;
dfs(m+1);
st[m] = 0;
}
int main()
{
cin>>n;
dfs(1);
return 0;
}
方案二:
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int n;
const int N = 20;
int st[N];
vector<vector<int>> ways; //存放每种方案的结果
int cnt; //记录总方案个数
void dfs(int m) //从第几位上的数开始递归
{
//如果递归完最后一层(第1到n位的数全部判断完选择),输出方案结果
if(m > n)
{
vector<int> way;
for(int i = 1; i <= n; i++)
if(st[i] == 1) way.push_back(i);
ways.push_back(way);
return;
}
//不是最后一层时,表示遍历到第m位上的数,有选择/不选择两种情况
//不选择
st[m] = 0;
dfs(m+1);
st[m] = 0;
//选择
st[m] = 1;
dfs(m+1);
st[m] = 0;
}
int main()
{
cin>>n;
dfs(1);
for(int j = 0;j < ways.size();j++)
{
for(int i = 0;i < ways[j].size();i++)
printf("%d ",ways[j][i]);
puts(""); //puts输出打印内容空然后换行
}
return 0;
}