#include<stdio.h>
int make_sign[10];//标记数组,如:make_sign[1]=0表示 1这个数字没有走过,全局变量不初始化,默认为0
int number[10];//用来存 数字 number[3]=1;表示输出的第三个数是1
int n,r;//n:一共有几个数,相当于每次走有几个路径可以选择
void combination(int layer)//layer:当前层数
{
int i;
if(layer > r)
{
for( i = 1; i <= r; i ++)//输出数字
{
printf("%d",number[i]);
}
printf("\n");
}
else
{
for(i = 1; i <= n; i ++)
{
if(make_sign[i] == 0 && number[layer -1] < i)
{
make_sign[i] = 1;
number[layer] = i;
combination(layer+1);
make_sign[i] = 0;
}
}
}
}
int main ()
{
number[0] = 0;//注意:只有这样才能执行子函数的第一个判断
scanf("%d%d",&n,&r);
combination(1);
return 0;
}
输出的次序, 取决于它在路径选取时的遍历次序,因为在这个思路中,是用number[i]来保存输出第i个数字
如: 一开始先选择小的数字,number[i]前面存的就是小的数字了
结束条件:输出几个数字 ,就是走了几次函数(也就是走了几层),当我layer逐渐增加,超过了layer的时候就是输出了