暴力!!!!

子集生成

增量构造法

#include<stdio.h>
bool a[100];
bool vis[100];
int n;
void dfs(int num){
    if(num==n+1)
    {
        for (int i=1;i<=n;i++)
           // if(a[i])
                printf("%d ",a[i]);
        printf("\n");
        return ;
    }
    for (int i=1;i<=2;i++){
        if(i==1){
           a[num]=0;
           dfs(num+1);
        }
        else {
            a[num]=1;
            dfs(num+1);
            a[num]=0;
        }
    }
}
int main(){
    scanf("%d",&n);
    dfs(1);
return 0;
}

二进制构造

位运算

A&B 交集

A|B 并集

A^B 对称差

#include<stdio.h>
bool a[100];
bool vis[100];
int n;
void dfs(int num){
  for (int i=0;i<=n;i++){
    if(num&(1<<i)) printf("%d ",i+1);
    //else printf("%d ",0);

  }printf("\n");
}
int main(){
    scanf("%d",&n);
    for (int i=0;i<(1<<n);i++)
    dfs(i);
return 0;
}

全排列

#include<stdio.h>
int a[1000];
int n;
void dfs(int num){
 if(num==n+1){
    for (int i=1;i<=n;i++)
        printf("%d ",a[i]);
    printf("\n");
    return ;
 }
 for (int i=1;i<=n;i++){
    int ok=1;
    for (int j=1;j<=num;j++){
        if(a[j]==i) ok=0;
    }
    if(ok){
       a[num]=i;
       dfs(num+1);
       a[num]=0;
    }
 }
}
int main(){
   scanf("%d",&n);
   dfs(1);
return 0;
}

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char a[10000];
int n;
int main(){
   //scanf("%d",&n);
   scanf("%s",a);
   n=strlen(a);
   sort(a,a+n);
   do{
    for (int i=0;i<n;i++)
        printf("%c ",a[i]);
    printf("\n");
   }while(next_permutation(a,a+n));

return 0;
}

posted @ 2017-10-21 20:52  lmjer  阅读(138)  评论(0编辑  收藏  举报