求一个全排列函数: 如p([1,2,3])输出:[123],[132],[213],[231],[312],[321]. 求一个组合函数 如p([1,2,3])输出:[1],[2],[3],[1,2],[2,3],[1,3],[1,2,3]

深度搜索的代码:

#include<stdio.h>
#include<string.h>
const int Max = 1010;
int n;
int a[Max];
bool b[Max];
void Dfs(int num)
{
    if(num==n)
    {
        for(int i=0;i<n;i++)
            printf("%d",a[i]);
        printf("
");
    }
    else
    {
        for(int i=1;i<=n;i++)
        if(!b[i])
        {
            b[i]=true;
            a[num]=i;
            Dfs(num+1);
            b[i]=false;
        }
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(b,false,sizeof(b));
        Dfs(0);
    }
    return 0;
}
View Code

采用字典序的排序的方法 :

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/13/2589738.html

思路:设一个数组a,数组a中的数必须是0和1当中的一个,将待组合数每一个数关联到数组中,接着按照二进制的规则,对数组a构建成的二进制数一步一步加1,在这个过程中,数组a每次构建一个二进制的数,对应数组为1的待组合数集合当中的数立即输出,构成一次组合,依次类推。

#include<stdio.h>
#include<math.h>
int main()
{
    int n,bit;
    int i,j,m;
    while(scanf("%d",&n)!=EOF)
    {
        m=pow(2,n);
        for(i=1;i<m;i++)
        {
            j=i;
            bit=1;
            while(j)
            {
                if(j%2)printf("%d",bit);
                j/=2;
                bit++;
            }
            printf("
");
        }
    }
    return 0;
}
View Code

采用字典序的排序的方法 :

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/13/2589738.html

原文地址:https://www.cnblogs.com/XDJjy/p/3648859.html