鸽笼原理 c语言,C语言程序 鸽笼原理 求解释!!

匿名用户

1级

2013-09-06 回答

/*

* 首先,解释一下整个程序的作用。

* 1. 让你输入一个有5个元素的数组==> a[5]

* 2. 循环开始: 查找有序数组,直到所有元素都输出一次

*     2.1 从a[]中取出一个排列,放到b[]中,比如a[] = {1,2,3,4,5}, 那么b[]就可以是{1},{2,5},{1,4,5}等

*     2.2 检查b是否是有序数组,如果是,输出b[]

*    循环结束: 检查是否a[]中的所有元素都已经输出过一次,如果是,退出循环

*/

#include

#define M 5

int a[M], b[M], len = -1, sign = 0;

void dfs(int n, int mark)

{

int i, flag;

if (n == 0) {   /* 子数组复制结束是到这里,判断是否有序数组 */

flag = 1;

/* 检查是否有序数组 */

for (i = 1; i 

if ((b[i - 1] 

flag = 0;

break;

}

}

/* 如果是有序数组,直接输出 */

if (flag == 1) {

sign = 1;   /* 标志整个数组中所有元素都已经输出,不进行下一轮for */

for (i = 0; i <= len; i++) {

printf("%d ", b[i]);

}

printf("\n");

}

/* 2. main中的第2次for开始,都是先进入这里 */

} else if (M - mark > n) {

/* 这一段也是复制子数组到b[],不过复制的个数是n,不是所有成员 */

len++;

b[len] = a[mark];

dfs(n - 1, mark + 1);

b[len] = 0;

len--;

/* 这个是控制第一个复制的元素, 就是从a[几]开始 */

dfs(n, mark + 1);

/* 1. 第一次进入函数是到这里,将整个a[]数组复制到b[]。dfs()会不断进入这里,不断复制 */

} else {

/* 查找一个降序序列,并复制到数组b中 */

len++;

b[len] = a[mark];

dfs(n - 1, mark + 1);

b[len] = 0;

len--;

}

}

void main()

{

int i;

/* 让你输入一个有5个元素的数组==> a[] */

for (i = 0; i 

scanf("%d", &a[i]);

}

/* 查找有序数组,直到所有元素都输出一次,检查的方式是

* 第一轮,取5个元素;第二轮,取4个元素;以此类推

*/

for (i = M; sign == 0; i--) {

dfs(i, 0);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值