#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m,i=1,g=1,rankNumber=0;//从n个里面选m个排列
int a[100];
cout<<"A(n,m)输入n,m(n>m):";
cin>>n>>m;
a[i]=1;
while(1)
{
g=1;//默认满足条件
for(int j=i-1;j>=1;j--){//循环遍历判断和选出来的元素有没有重复的
if(a[i]==a[j])
{
g=0;//如果有重复的元素,改为不满足条件
break;
}
}
if(g&&i==m)//如果满足条件,且选出了所有要选元素
{
rankNumber++;//记录有多少种情况
for(int j=1;j<=m;j++)//循环遍历输出选出的元素
{
cout<<a[j]<<" ";
}
cout<<endl;
}
if(g&&i<m)//如果满足条件,且未选所有要选的的元素
{
i++;//继续选择下一个元素
a[i]=1;//下一个元素从1开始
continue;
}
while(i>1&&a[i]==n)i--;//如果当前元素已经达到最大值,无法继续选出下一个元素,向前回溯
if(i==1&&a[i]==n)//第一个元素到达最大值,且无法选出下一个元素
{
break;
}
else
{
a[i]+=1;//使当前元素+1作为下一种排列
}
}
cout<<"A("<<n<<","<<m<<"):"<<rankNumber;
return 0;
}
//伯努利装错信封问题需要在选择条件中使a[]数组对应位置的i的值不等于i