Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192247
  • 博文数量: 16
  • 博客积分: 552
  • 博客等级: 中士
  • 技术积分: 236
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-28 16:41
文章分类

全部博文(16)

文章存档

2012年(1)

2011年(12)

2010年(3)

分类: C/C++

2011-07-26 08:57:23

题目:求N的全排列

N的全排列就是N-1的全排列排列与N的排列。依此类推,N-1的排列就是N-1 与 N-2的全排列的排列, N-2...
当N=1时就只有1的全排列1。那么算法的思想就是先确定一个前缀,然后递归求解N-1,N-2...的全排列。

void Perm(char *a, int begin, int end) /* 产生begin到end的全排列 */ 

        int i; 
        if(begin == end){             /* 一直计算到了N为1的情况, 此次全排列计算结束,输出*/ 
                for(i=0; i<=end; i++) 
                        printf("%c",a[i]); 
                printf(" "); 
        } 
        else{ 
                for(i=begin; i<=end; i++){ 
                        Swap(a,begin,i);  /*
交换前缀,使之产生下一个前缀.*/
                        Perm(a,begin+1,end); 
                        Swap(a,begin,i); /*
将前缀换回来,继续做上一个的前缀排列.*/
                } 
        } 


void Swap(char *a, int m, int n) 

        char temp; 
        temp = a[m]; 
        a[m] = a[n]; 
        a[n] = temp; 

这个算法的核心就是是将第begin个元素与后面的每个元素进行交换,求出其全排列。
阅读(1380) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~