7-3 组合问题(*)

从 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;
		}
	}
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值