#include <stdio.h>
#define N 10 //1~N
#define K 4 //选k个
int count = 0; //全局变量,统计组合个数
void fun(int *p[])
{
int i;
for(i = 0; i < K; i++)
{
printf(\"%-4d\", *p[i]); //打印当前状态k个指针的指向值
}
printf(\"\\n\"); //打印完一个组合换行
count++; //打印完一个组合count++
for(i = 0; i < K-1; i++)
{
if(*p[K-1] < N) //当最后一根指针不指向N时,后移一次并进入一层递归
{
p[K-1]++; //指针后移
fun(p);
break;
}
if(*p[K-1-i] == N-i && *p[K-1-(i+1)] < N-(i+1)) //对倒数i根和i+i根指针进行判定,如果倒数第i指向N-i,且i-1并没有指向N-1-i,就让倒数i-1往后移一格,把倒数i回溯到i-1的后一个位置
{
p[K-1-(i+1)]++;
int j;
for(j = i; j >= 0 ; j--) //倒数i+1后移一格后,把倒数0-i的所有指针,全部回溯到前一根指针的后一位
{
p[K-1-j] = p[K-1-(j+1)]+1;
}
fun(p);
break;
}
}
}
int main()
{
int a[N];
int *pa[K] = {NULL}; //指针数组,存k个指针
int i;
for(i = 0; i < N; i++)
{
a[i] = i+1;
}
for(i = 0; i < K; i++)
{
pa[i] = &a[i]; //指针数组初值,分别指向数组前k个,pa[0]指向a[0],pa[1]指向a[1]依此类推
}
fun(pa);
printf(\"共有%d种排列\\n\", count);
return 0;
}
继续阅读与本文标签相同的文章
上一篇 :
阿里云产品头条(2018年1月刊)
-
开发者必读 · 周报 | 002期
2026-05-19栏目: 教程
-
斩获2019中国金融科技创新大赛金奖,蚂蚁金服mPaaS助力打造超级App生态
2026-05-19栏目: 教程
-
有呀!互联网icp许可证除申请以外有转让的吗?飞起
2026-05-19栏目: 教程
-
Apache Zepplin使用Hive Interpreter查询
2026-05-19栏目: 教程
-
大宗货运如何实现“重去重回”?
2026-05-19栏目: 教程
