数字的全排列

来源:互联网 发布:js parsedouble 编辑:程序博客网 时间:2024/04/29 17:02

 全排列问题

  这一周的问题是打印出0-7的全排列,看上去是很简单的题目了,呵呵,,,,难道你想用七层循环吗?呵呵。。不知道时候可行,但是一定不是很好看呀,我的编程习惯告诫我不能这样,在那本书上看过,最好不要多于三层。
  后来张鹏告诉我这是一个深度优先搜索的问题,看了一下《算法导论》,不是很懂呀。。。。不过也看出了一些思路,就是对已经用过的元素进行标记,所以我使用了二维数组,经过两个小时左右的编码,调试,我终于实现了,而且可以是0-9的全排列。。源代码如下:
 
#include<stdio.h>
#define NUM 10 /* 任意定义数字的数目,本题为8 */
int a[NUM][2]; /* 保存数字和状态 */
int b[NUM], total = 0; /* 保存每次的数字,排列总数 */
void init(void) /* 初始化数组 */
{
int i;
for (i = 0; i < NUM; i++) { 
a[i][0] = i; /* 0——NUM - 1 赋值 */
a[i][1] = 0; /* 状态:0,未使用 */
}
}
void pai(int num)/* 定义排列的函数,参数num表示排列的位置0——NUM-1 */
{
int i;
for(i = 0; i < NUM; i++) {
if (a[i][1] == 1) /* 已经使用*/
continue;
a[i][1] = 1; /* 1,使用 */
b[num] = a[i][0]; /* num位的数字 */
if(num == NUM - 1){ /* 打印结果 */
int j;
for (j = 0; j < NUM; j++)
printf("%d", b[j]);
printf("/n");
total++; /* 计数 */
a[i][1] = 0; /* 回复为未使用 */
return; /* 重新开始 */
}
pai(num+1); /* 排列下一个 */
a[i][1] = 0; /* 回复为未使用  */
}
}
int main()
{
init(); /* 初始化 */
pai(0); /* 开始排列 */
printf("the total is %d/n", total);
return 0;
}
原创粉丝点击