匿名用户
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);
}
}