USACO 2.1.5 海明码 Hamming Codes

题解

这道题比较简单,就是暴力遍历,一个个试就可以了。
海明距离就是简单的位运算 异或一下就出来了。
代码也比较清晰了不解释。


代码

#include <iostream>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
int n,m,b,d;
int cot[70],ans[65];
int s=0;

int cal_dis(int x,int y){
    int c,ox;
    c = 0;
    ox= x^y;
    for(int i=0;i<b;i++){
        if(ox%2 == 1) c++;
        ox/=2;
    }
    return c;
}

bool compact(int num){
    for(int i=0;i<s;i++){
        if( cal_dis(num,ans[i]) < d){
            return false;
        }
    }
    return true;
}

void dfs(int cur_num){
    if(s==n) {
        for(int i=0,nn=1;i<s;i++){
            cout<<ans[i];
            if(nn%10 == 0) cout<<endl;
            else{
                if(i!=s-1) cout<<" ";
                else cout<<endl;
            }
            nn++;
        }
        exit(0);// 直接结束
    }

    for(int i = cur_num; i<=256 ; i++){
        if( compact(i) ){
            ans[s++] = i;
            dfs(i+1);
            s--;
        }
    }
}
int main(void){

    cin>>n>>b>>d;
    dfs(0); 
    return 0;
}

猜你喜欢

转载自blog.csdn.net/smmyy022/article/details/81453963