1.主要是对递归的理解是否深入
2.对输出情况的把握
3.对整个流程了熟于心(可以画树,方便理解);
描述
给1到N,N个数,要你从中选取M个出来,请输出每一种的选取情况(根据序列字典序输出,即两个序列比大小,第一位小的小,若相等第二位小的小,若相等第三位小的小……)。
输入
输入一行,包括两个整数N, M。(2 \lt M \lt N \le102<M<N≤10)
输出
输出若干行,每行表示一个组合方式,按字典序输出。
注意:每行末尾有空格
输入样例 1
4 3
输出样例 1
1 2 3
1 2 4
1 3 4
2 3 4
#include<stdio.h>
int pai(int *a,int i,int n,int m);
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int a[n+2];
pai(a,1,n,m);
return 0;
}
int pai(int *a,int i,int n,int m)
{
for(int k=i;k<=n;k++)
{
if(i==1||k>a[i-1])//第一位一定填
a[i]=k;
else continue;
if(n-k>=m-i&&m-i>0)
{//若缺少m-i>0 m位会变成最大的(即n)
pai(a,i+1,n,m);//最后一位时应该特殊考虑,->全部遍历过去! r25 solve this problem!!
}//如果有还未填完,递归入下一次,直到全部填完
else if(m==i)
{//进入此处m===i!!!!
//代表全部填完!!
for(int j=1;j<=m;j++)
printf("%d ",a[j]);
printf("\n");
}
}
}