zoukankan      html  css  js  c++  java
  • 【USACO 2.1】Hamming Codes

    /*
    TASK: hamming
    LANG: C++
    URL:http://train.usaco.org/usacoprob2?a=5FomsUyB0cP&S=hamming
    SOLVE: 找粗一个值最小的n个元素的集合,每个元素都是不超过m位二进制的数,且两两之间二进制位不同的位不小于d。
    dfs,枚举每一个数,枚举范围:(前一个数,1<<m),每次进入dfs都判断一下当前集合是否满足两两距离不小于d。
     */
    #include<cstdio>
    int n,m,d;
    int a[1024];
    int dis(int a,int b){
        int d=0;
        for(int i=0;i<m;i++)
            if((a&(1<<i))^(b&(1<<i)))
                d++;
        return d;
    }
    bool ck(int n){
        for(int i=0;i<n-1;i++)
            for(int j=i+1;j<n;j++)
                if(dis(a[i],a[j])<d)return 0;
        return 1;
    }
    bool dfs(int x){
        if(!ck(x))return 0;
        if(x==n){
            for(int i=0;i<n;){
                printf("%d",a[i++]);
                for(int j=2;j<=10&&i<n;j++,i++)
                    printf(" %d",a[i]);
                puts("");
            }
            return 1;
        }
        for(int i=x?a[x-1]+1:0;i<1<<m;i++){
            a[x]=i;
            if(dfs(x+1))return 1;
        }
        return 0;
    }
    int main(){
        freopen("hamming.in","r",stdin);
        freopen("hamming.out","w",stdout);
        scanf("%d%d%d",&n,&m,&d);
        dfs(0);
    }
      
  • 相关阅读:
    POJ2594拐点弯的二分
    poj1523赤裸裸的割点
    POJ2239二分匹配
    对java多线程的一些浅浅的理解
    POJ3216 最小路径覆盖
    POJ1719二分匹配
    [算法]本学期算法作业
    [离散数学II]2017.3.29
    [离散数学II]2017.3.29
    [概率论]2017.3.29
  • 原文地址:https://www.cnblogs.com/flipped/p/5924945.html
Copyright © 2011-2022 走看看