Wingy

早起的鸟儿有虫吃,早起的虫儿被鸟吃。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

排列与组合的实现

Posted on 2006-12-08 01:36  Wingy  阅读(673)  评论(0编辑  收藏  举报
出道又简单也不怎么简单的题目,大家有兴趣讨论一下啊哈哈,就是排列组合啦。
输入n(0<n<12)
对字符串s="ABCDEFGHIJKL";
(1)前n个字符作全排列,按(字典)顺序输出。
比如:n=3时
ABC
ACB
BAC
BCA
CAB
CBA
共有n!个
(2)前n个字符作全组合,按顺序输出。
A
B
C
AB
AC
BC
ABC
共有2^n-1个。
 另一种顺序:
A
B
AB
C
AC
BC
ABC

不知道看明白没有。 下面是我以前写的代码:
全排列:

#include<stdio.h>
#include
<string.h>

char s[]="abcdefghi",ch;  //ch为字符交换临时变量
int len;   //字符串长度
//以上变量定义为全局变量,因为要参与子函数运算
int x(i,k){         //递归函数,核心代码
    if(i<len-1) x(i+1,len-1);
    
else {
        printf(
"%s\n",s);    //显示字符串
        return 0;
     }

    
if(i<k){
        ch
=s[i];
        s[i]
=s[k];       //交换第i,k个字符
        s[k]=ch;
        strrev(s
+i+1);   //把递i个之后的字符串逆序排列
        k--;
        x(i,k);
        
return 0;
    }

 }

 
int main(){   //主函数
    int i=0,k;     //i,k可是说是两个指针吧,i初始状态指向第一个字符
    len=strlen(s);  //len得到字符串长度
    k=len-1;        //k指向最后一个字符
    x(i,k);         //调用子函数,充分利用了局部变量不被子函数改变的性质
    return 0;
}

全组合:(数字代替字母了)

#include<stdio.h>
int n,p=1,s[100]={0};
void R(int j,int i)
{
    
int k;
    
if(i==0)
    
{
        
for(k=1;k<p-1;k++)
            printf(
"%d ",s[k]);
        printf(
"%d\n",s[k]);
    }

    
else
    
{
        
for(k=j;k<=n+1-i;k++)
        
{
            s[p
++]=k;
            R(k
+1,i-1);
            p
--;
        }

    }

    
return ;
}


int main()
{
    
int i;
    scanf(
"%d",&n);
    
for(i=1;i<=n;i++) R(1,i);
    
return 0;
}

另一种顺序(实现方法):
#include<stdio.h>
int main()
{
    
int i,j,x=1,n;
    scanf(
"%d",&n);
    x
<<=n;
    
for(i=1;i<x;i++)
    
{
        
for(j=0;j<n;j++)
        
{
            
if((1<<j)&i)
                printf(
"%d ",j+1);
        }

        printf(
"\n");
    }

    
return 0;
}