生成器

递归排列

#include<cstdio> #include<iostream> using namespace std; void print_permutation(int n, int a[], int cur) { if (cur == n) { for (int i = 0; i < 10; i++)cout << a[i]; cout << endl; return; } else { for (int i = 0; i < 10; i++) { int ok = 1; for (int j = 0; j < cur; j++) if (a[j] == i) ok = 0; if (ok) {a[cur] = i; print_permutation(n, a, cur + 1);} } } } int main(void) { int a[10]; for (int i = 0; i < 10; i++) a[i] = i; print_permutation(10, a, 0); return 0; }

 

#include<cstdio>
#include<iostream>
using namespace std;

void print_permutation(int n, int a[], int s[], int cur)
{
    //提前将原始数组排序
    if (cur == n) { for (int i = 0; i < n; i++)  cout << a[i];  cout << endl; return; }
    else
    {
        for (int i = 0; i < n; i++)
            if(!i||s[i]!=s[i-1])
            {
                int c1 = 0, c2 = 0;
                for (int j = 0; j < cur; j++) { if (a[j] == s[i]) c1++; }
                for (int j = 0; j < n; j++) { if (s[j] == s[i])c2++; }
                if (c1 < c2) { a[cur] = s[i]; print_permutation(n, a, s, cur + 1); }
            }
    }
}
int main(void)
{
    int s[3] = { 1,1,1 };
    int a[3];
    print_permutation(3, a, s, 0);
    return 0;
}

 

子集生成器

#include<cstdio>
#include<iostream>
using namespace std;

void print_subset(int n, int a[], int cur)
{
    for (int i = 0; i < cur; i++) cout << a[i];
    cout << endl;
    int s = cur ? a[cur - 1] + 1 : 0;
    for (int i = s; i < n; i++)
    {
        a[cur] = i;
        print_subset(n, a, cur + 1);
    }
}

int main(void)
{
    int a[5];
    print_subset(5, a, 0);
    return 0;
}

 

#include<cstdio>
#include<iostream>
using namespace std;

void print_subset(int n, int a[], int cur)
{
    if (cur == n)
    {
        for (int i = 0; i < cur; i++)
        {
            if (a[i])printf("%d", i);
        }
        puts("");
        return;
    }
    a[cur] = 1;
    print_subset(n, a, cur + 1);
    a[cur] = 0;
    print_subset(n, a, cur + 1);
}

int main(void)
{
    int a[5];
    print_subset(5, a, 0);
    return 0;
}

 二进制

#include<cstdio>
#include<iostream>
using namespace std;

void print_subset(int n, int s)
{
    //打印出s对应的各个元素
    for (int i = 0; i < n; i++)
        if (s & (1 << i)) printf("%d", i);
    cout << endl;
}

int main(void)
{
    int n;
    cin >> n;
    //print_subset(3, 7);
    //枚举子集
    for (int i = 0; i < (1 << n); i++)
        print_subset(n, i);

}

 

posted @ 2021-02-03 12:48  loliconsk  阅读(55)  评论(0)    收藏  举报