从 m (0<m≤26) 个大写字母中任意选出 n (0<n≤m) 个字母组合到一起,一共有多少种组合?
请编写程序,输入 m 和 n,输出从 A 开始的连续 m 个字母中任取 n 个字母的所有组合。
要求:每行输出一个组合(组合内的字母按升序排序),按字典序输出。
输入样例
4 3
输出样例
ABC
ABD
ACD
BCD
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 26 + 5;
int m,n,a[N]; //数组a模拟盒子,n个盒子,m张牌
bool used[N]; //m张牌的状态,初始化false-表示牌在手中(没用过)
//在第step个盒子放牌
void dfs(int step);
int main()
{
cin >> m >> n; //m个字母取n个
dfs(1); //从第1个盒子开始放牌
return 0;
}
//在第step个盒子放牌
void dfs(int step)
{
//到达第n+1个盒子时,放牌结束,输出当前的方案
if(step == n + 1){
//1-n号盒子的每张牌输出就可以
for(int i = 1;i <= n;i++){
printf("%c",a[i] - 1 + 'A');
}
printf("\n");
return;
}
//枚举手中的n张牌a[step - 1]
for(int i = a[step - 1] + 1;i <= m;i++){
//i号牌如果在手中,也就是没用过
//i号牌必须比上一个盒子(step - 1)的牌要大
if(!used[i]){
//i号牌放入当前盒子(编号是step)
a[step] = i;
//修改i号牌的状态
used[i] = true;
//继续到第step+1盒子放牌,递归调用
dfs(step + 1);
//回溯,当前盒子取回牌,尝试下一个方案
used[i] = false;
}
}
}