数字的全排列

  全排列问题

  这一周的问题是打印出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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值