Hamming Codes

链接

分析:码农模拟题,首先我们先求出对于0来说满足条件的数,然后在从集合当中筛选出任意两个都满足条件的数即可

  1 /*
  2     PROB:hamming
  3     ID:wanghan
  4     LANG:C++
  5 */
  6 #include "iostream"
  7 #include "cstdio"
  8 #include "cstring"
  9 #include "string"
 10 #include "vector"
 11 #include "cmath"
 12 #include "algorithm"
 13 using namespace std;
 14 const int maxn=1000+10;
 15 int N,B,D;
 16 vector<int> p;
 17 int vis[maxn];
 18 string transform(int x,int y,string s)
 19 {
 20     string res="";
 21     int sum=0;
 22     for(int i=0;i<s.length();++i)
 23     {
 24         if(s[i]==‘-‘)  continue;
 25         if(s[i]>=‘0‘&&s[i]<=‘9‘)
 26         {
 27             sum=sum*x+s[i]-‘0‘;
 28         }
 29         else
 30         {
 31             sum=sum*x+s[i]-‘A‘+10;
 32         }
 33     }
 34     while(sum)
 35     {
 36         char tmp=sum%y;
 37         sum/=y;
 38         if(tmp<=9)
 39         {
 40             tmp+=‘0‘;
 41         }
 42         else
 43         {
 44             tmp=tmp-10+‘A‘;
 45         }
 46         res=tmp+res;
 47     }
 48     if(res.length()==0)  res="0";
 49     if(s[0]==‘-‘)  res=‘-‘+res;
 50     return res;
 51 }
 52 string change(int x){
 53     string res="";
 54     while(x){
 55         int num=x%10;
 56         res+=num+‘0‘;
 57         x/=10;
 58     }
 59     int i=0,j=res.length()-1;
 60     while(i<j){
 61         swap(res[i],res[j]);
 62         i++,j--;
 63     }
 64     return res;
 65 }
 66 bool solve(int a,int b){
 67     string s1=transform(10,2,change(a)),s2=transform(10,2,change(b));
 68     string res1="",res2="";
 69     int cha;
 70     if(s1.length()<B){
 71         cha=B-s1.length();
 72         for(int i=0;i<cha;i++)
 73             res1+=‘0‘;
 74     }
 75     res1+=s1;
 76     if(s2.length()<B){
 77         cha=B-s2.length();
 78         for(int i=0;i<cha;i++)
 79             res2+=‘0‘;
 80     }
 81     res2+=s2;
 82     int cnt=0;
 83     for(int i=0;i<B;i++){
 84         if(res1[i]!=res2[i]){
 85             cnt++;
 86         }
 87     }
 88     if(cnt>=D)
 89         return true;
 90     return false;
 91 }
 92 struct Node{
 93     int x;
 94     string res;
 95 };
 96 bool cmp(Node a,Node b){
 97     return a.res<b.res;
 98 }
 99 int main()
100 {
101     freopen("hamming.in","r",stdin);
102     freopen("hamming.out","w",stdout);
103     cin>>N>>B>>D;
104     p.push_back(0);
105     int pos=0;
106     int i=1;
107     int num=pow(2,B+1)-1;
108     while(i<num){
109         if(solve(pos,i)){
110             p.push_back(i);
111         }
112         i++;
113     }
114     memset(vis,0,sizeof(vis));
115     int len=p.size();
116     for(int i=0;i<len;i++){
117         for(int j=i+1;j<len;j++){
118             if(!vis[i]){
119                 if(vis[j]||!solve(p[i],p[j])){
120                     vis[j]=1;
121                 }
122             }
123         }
124     }
125     vector<int> f;
126     for(int i=0;i<len;i++){
127         if(!vis[i]){
128             int zz=p[i];
129             f.push_back(zz);
130         }
131     }
132     for(int i=0;i<N;i++){
133         if(i%10==9){
134             cout<<f[i]<<endl;
135         }else{
136             if(i==N-1)
137                 cout<<f[i]<<endl;
138             else
139                 cout<<f[i]<<" ";
140         }
141     }
142     return 0;
143 }

时间: 2024-10-11 13:37:59

Hamming Codes的相关文章

洛谷 P1461海明码 Hamming Codes 枚举 搜索

洛谷 P1461海明码 Hamming Codes枚举 搜索 1 #include <bits/stdc++.h> 2 using namespace std ; 3 4 const int N = 11 ; 5 int mx,B,n,D ; 6 int bin[N] ; 7 struct base{ 8 bool f[ N ] ; 9 inline void clear() { 10 for(int i=1;i<N;i++) f[ i ] = 0 ; 11 } 12 inline vo

洛谷 P1461 海明码 Hamming Codes

P1461 海明码 Hamming Codes 题目描述 给出 N,B 和 D,要求找出 N 个由0或1组成的编码(1 <= N <= 64),每个编码有 B 位(1 <= B <= 8),使得两两编码之间至少有 D 个单位的“Hamming距离”(1 <= D <= 7).“Hamming距离”是指对于两个编码,他们二进制表示法中的不同二进制位的数目.看下面的两个编码 0x554 和 0x234(0x554和0x234分别表示两个十六进制数): 0x554 = 010

【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; in

USACO Hamming Codes DFS 构造

我还是用了很朴素的暴力匹配A了这题,不得不感叹USACO时间放的好宽... /* ID: wushuai2 PROG: hamming LANG: C++ */ //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <fstream> #include <cstring>

Section 2.1.Hamming Codes (hamming)

//题目的链接http://www.nocow.cn/index.php/Translate:USACO/hamming/*[位运算]+[异或操作]*//* ID: zhangsh35 PROG: hamming LANG: C++ */ #include<iostream> #include<math.h> #include<stdio.h> using namespace std; const int MAXN=64; int ham[MAXN]; int tot,

USACO Section 2.1: Hamming Codes

dfs简单题 1 /* 2 ID: yingzho2 3 PROG: hamming 4 LANG: C++ 5 */ 6 #include <iostream> 7 #include <fstream> 8 #include <string> 9 #include <map> 10 #include <vector> 11 #include <set> 12 #include <algorithm> 13 #includ

usaco Hamming Codes

题目很简单,找出N个二进制下长度为B的,且两两之间二进制位上至少有D位不同 暴力枚举就好了 /* ID: modengd1 PROG: hamming LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> using namespace std; int sta[64]; bool slove(int sta[64],int N,int B,int D,int deep) { if

USACO-Section 2.1 Hamming Codes (DFS)

描述 给出 N,B 和 D:找出 N 个编码(1 <= N <= 64),每个编码有 B 位[二进制](1 <= B <= 8),使得两两编码之间至少有 D 个单位的"海明距离"(1 <= D <= 7)."海明距离"是指对于两个编码,他们的二进制表示法中的不同二进制位的数目.看下面的两个编码 0x554 和 0x234 之间的区别(0x554 表示一个十六进制数,每个位上分别是 5,5,4): 0x554 = 0101 0101

USACO Section2.1 Hamming Codes 解题报告 【icedream61】

hamming解题报告------------------------------------------------------------------------------------------------------------------------------------------------[题目] 找出N个二进制数,每个数有B位,使得各数两两之间“海明距离”至少为D.(若有多组解,输出字典序最小的.) 海明距离是指:两个二进制数不同二进制位的个数.[数据范围] 1<=N<=