排列组合算法

参考资料:

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;
}
原文地址:https://www.cnblogs.com/nethirte/p/3046129.html