这一题与全排列的区别就是其不能有重复
以题目里面的例子来看
输入
5 3
输出
1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5
用dfs来思考,走三步,第一步走1,则后面的两步里选择的答案必须大于1,第二步选择2,第三步就必须是>2的数字
选完之后就有了前三个答案,然后退一步,回到第二步,此时选择的数字必须>2,在次选择3,进入第三步,在第三步选择的数字必须 >3
所以可以看出来,我们每走一步,后面的数字必须大于前面的数字
代码如下
#include <bits/stdc++.h>
using namespace std;
int n,r,u;
bool mp[22];
int ans[22];
void dfs(int u)
{
if(u == r+1)
{
for(int i = 1; i <= r; i++)//打印的空格数要看情况(题目有说明)
if(ans[i] < 10)
cout << " " << ans[i];
else
cout << " " << ans[i];
cout << endl;
return;
}
for(int i = ans[u-1];i <= n; i++)//后面的数字必须大于前面的数字,但是循环开始必须从1开始,所以在主函数里面,定义ans[0] = 1
if(mp[i] == false)
{
mp[i] = true;
ans[u] = i;
dfs(u+1);
mp[i] = false;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
ans[0] = 1;//满足循环从1开始
cin >> n >> r;
memset(mp,false,sizeof(mp));//初始化
dfs(1);
return 0;
}