题目描述
排列与组合是常用的数学方法,其中组合就是从 个元素中抽出 个元素(不分顺序且),我们可以简单地将 个元素理解为自然数 ,从中任取 个数。现要求你输出所有组合。
例如 ,所有组合为:。
输入格式
一行两个自然数 。
输出格式
所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。
注意哦!输出时,每个数字需要 个场宽。以 为例,你可以使用下列代码:
cout << setw(3) << x;
输出占 个场宽的数 。注意你需要头文件 。
输入输出样例
样例输入
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
思路
很简单一道深度优先搜索的题,具体思路见代码中的批注。
完整代码
#include<bits/stdc++.h>
using namespace std;
int n,r,a[30];
void dfs(int k){ //回溯函数
if(k>r){ //如果选择的数字已有r个就输出
for(int i=1;i<=r;i++)
printf("%3d",a[i]); //注意场宽为3
printf("\n"); //返回第k-1层循环
return ;
}
for(int i=a[k-1]+1;i<=n;i++){ //从上一层循环中的i+1循环到n
a[k]=i,d(k+1); //进入下一层循环
}
int main()
{
scanf("%d%d",&n,&r);
dfs(1);
return 0;
}