#C07L03P05. C07.L03.组合数学之排列问题.排列方案的递归编程1.程序模板

C07.L03.组合数学之排列问题.排列方案的递归编程1.程序模板

求:

前 N 个小写字母中取 M 个的所有排列。 按照字典序从小到大输出。

0 < M <= N <6

#include<bits/stdc++.h>
using namespace std;
int ans[10],n,m;;
bool used[10];
void dfs(int l) //l表示这一次调用是找第l个字母,找到之后填入ans数组 
{
	int i;
	if(l==m+1)  //已经选够m个字母,输出 
	{
		for(i=1;i<=m;i++)
			printf("%c",'a'+ans[i]);
		printf("\n");
	}
	else
	{
		for(i=0;i<n;i++)
		{
			if(used[i]) continue;  //表示第i个字母已经在之前被选过,不能重复选 
			used[i] = true;  //打上标记,选后面的字母的时候不能在选这个字母 
			ans[l] = i;  //选了这个字母记录在ans数组里面,以便将来打印输出 
			dfs(l+1); //递归,继续找下一个字母 
			used[i] = false; //取消标记,选后面的字母的时候可以选第i个字母 
		}
	}
}
int main()
{

	cin>>n>>m;
	dfs(1);  //从第1个字母开始找 
	return 0;
}