生成排列

可以用暴力求解法生成 1n 的全排列,总结一下,刘汝佳《算法入门经典》中的三种求解方法。

生成 1n 的全排列

void print_permutation(int n,int *A,int cur)
{
    if(cur==n)
    {
        for(int i=0 ; iprintf("%d ",A[i]);
        printf("\n");
    }else for(int i=1 ; i<=n ;++i)
    {
         bool ok = true;
        for(int j=0 ; j//是否已经选择过
            if(A[j] == i) ok = false;
        if(ok)
        {
            A[cur] = i;
            print_permutation(n,A,cur+1);
        }

    }
}

生成可重集上的排列

void print_permutation(int n,int *A,int *P,int cur,int *cnt)
{
    if(cur == n)
    {
        for(int i=0 ; iprintf("%d ",A[i]);
        putchar('\n');
    }else for(int i=0 ; iint c=0;

        for( int j=0 ; jif(A[j]==P[i])c++;

        if(c1,cnt);
        }
    }
}

用STL< algorithm >中的方法

for(int i=0 ; i"%d",&p[i]);
    sort(p,p+n);

    do{
            for(int i=0 ; iprintf("%d ",p[i]);
            putchar('\n');
    }while(next_permutation(p,p+n));

你可能感兴趣的:(算法理论)