1. 程式人生 > >總結: 全排列  和  全部子集 (深搜…

總結: 全排列  和  全部子集 (深搜…

                                                                       暴力列舉

(參照劉汝佳程式碼)

找出集合中的全部排列組合:

#include <cstdio>
#include <iostream>
using namespace std;
#define MAX 20

void print_permutation(int n,int *p,int *a,int cur)   //引數列表 n:個數 p:需要排列元素列表
{                                                    //a: 輸出儲存的列表  cur: 遞迴時記錄當前排列好的個數
    int i,j;
    if(cur == n)
    {
        for(i = 0; i < n; ++i)
            printf("%d ",a[i]);
        printf("\n");
    }
    else
    {
        for(i = 0; i < n; ++i)
        {
            if(!i || p[i] != p[i-1])  //消除元素重複的情況. 例如:(1,1,1)排除輸出27次
            {
                int c1 = 0, c2 = 0;
                for(j = 0; j < cur; ++j) if(a[j] == p[i]) c1++;
                for(j = 0; j < n; ++j) if(p[i] == p[j]) c2++;
                if(c1 < c2)
                {
                    a[cur] = p[i];
                    print_permutation(n,p,a,cur+1);
                }
            }
        }
    }
}

int main()
{
    int p[MAX] = {2,1,3};
    int a[MAX];