#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;
}
收藏 打印