zoukankan      html  css  js  c++  java
  • 排列组合算法

    参考资料:

    http://bbs.pediy.com/showthread.php?t=167693
    http://www.cnblogs.com/autosar/archive/2012/04/08/2437799.html

    /*
    
    */
    
    #include <Windows.h>
    #include <stdio.h>
    
    char comb_array[]={'A','B','C','D','E','F','G','H','I','J'};
    char perm_array[]={'A','B','C'};
    
    char temp[9]={0};
    
    int top=0;
    
    
    void comb(int s,int n,int k) //从左边第s个元素开始选择
    {
    
        if (s > n)
        {
            return;
        }
        if (top == k) //如果temp中的元素已达到k个,打印出该组合
        {
            for (int i=0;i<k;i++)
            {
                printf("%c",temp[i]);
            }
            printf("\n");
            return;
        }
    
        temp[top++]=comb_array[s];//把第s个元素放进temp
        comb(s+1,n,k); //如果temp中的元素不够k,顺序再选择一个
        top--; //从temp中去掉最后选进的元素,顺序再选择一个
        comb(s+1,n,k);
    }
    
    void comb2(int n,int k)
    {
        int i;
        if (k==0)
        {
            i=0;
            do 
            {
                printf("%c",temp[i]);
                i++;
            }while(temp[i]!=0);
            printf("\n");
            
            return;
        }
    
        for (int j=n;j>=k;j--)
        {
            temp[k-1]=comb_array[j-1]; //反向选择一个元素,放入temp中
            if (k>1)
            {
                comb2(j-1,k-1); //剩余的集合(n-1)进行一次(k-1)组合
            }
            else
            {
                i=0;
                do 
                {
                    printf("%c",temp[i]);
                    i++;
                }while(temp[i]!=0);
                printf("\n");
            }
        }
    
    }
    
    char flag[9]={0};
    
    void perm(int m,int n) //P(n,m)
    {
    
        if (m>=n)
        {
            for (int i=0;i<n;i++)
            {
                printf("%c",temp[i]);
            }
            printf("\n");
            
            return;
        }
    
        for (int i=0;i<n;i++)
        {
            if (flag[i]==0)
            {
                flag[i]=1; //取出第i个
                temp[m]=perm_array[i]; 
                perm(m+1,n); //取后面的元素,直到m=n
                flag[i]=0; //标识第i个已取
            }
        }
    
    }
    
    void swap(int i,int j)
    {
        char t=perm_array[i];
    
        perm_array[i]=perm_array[j];
    
        perm_array[j]=t;
    }
    
    void perm2(int m,int n) 
    {
        if (m>=n)
        {
            for (int i=0;i<n;i++)
            {
                printf("%c",perm_array[i]);
            }
            printf("\n");
            return;
        }
    
        for (int j=m;j<n;j++)
        {
            swap(m,j); //从未选出的集合(第m个-第n个)中选出一个元素j
    
            perm2(m+1,n); //继续选出直到m>=n
    
            swap(m,j); 
    
        }
    }
    
    void main()
    {
        //perm(0,3);
        //perm2(0,3);
        //comb(0,5,3);
    
        //comb2(5,3);
    
        return;
    }
  • 相关阅读:
    Azure产品目录
    AWS产品目录
    BD
    Cloud Resource
    do-release-upgrade升级笔记
    Gluster vs Ceph:开源存储领域的正面较量
    OpenStack大规模部署详解
    SECURITY ONION:防御领域的kali
    vue非父子组件间传参问题
    vue源码之响应式数据
  • 原文地址:https://www.cnblogs.com/nethirte/p/3046129.html
Copyright © 2011-2022 走看看