http://train.usaco.org/usacoprob2?a=JavNK9GpMNL&S=hamming
因为输出格式的问题连wa好几下,最讨厌这种不标注输出格式让你自己观察的题了!!
这道题直接暴力过的,因为数据范围比较小。最坏情况是C81一直加到C88,直接暴力搜就好了,方法同上一道饲料题。要求数字最小,所以先排个序,然后遍历,找符合条件的即可。
上一道题看有人用stl 的bitset库,觉得挺好玩,所以这道题也试着用了用。直接把二进制数字转换成整数的函数实在太好用了!还可以直接创建bitset类型的数组,很方便。
bitset库常见用法:
1.bitset<n> b:创建一个n位的,每位都为0的二进制数
1.b.to_ulong():把b转化为整数
代码如下:
/*
ID:49743541
LANG:C++
TASK:hamming
*/
#include <stdio.h>
#include <iostream>
#include <bitset>
#include <algorithm>
using namespace std;
int N,B,D;
bitset<8> b[100000];
bitset<8> num;
bool mark[100000];
int n = 0;
bool compare(bitset<8> A,bitset<8> B){
if(A.to_ulong()<B.to_ulong())
return true;
return false;
}
void dfs(int wei,int amount){
//printf
if(wei==B) return;
if(amount>=D){
b[n] = num;
n++;
}
num[wei+1] = 1;
dfs(wei+1,amount+1);
num[wei+1] = 0;
dfs(wei+1,amount);
}
int main(){
freopen("hamming.in","r",stdin);
freopen("hamming.out","w",stdout);
scanf("%d%d%d",&N,&B,&D);//D是距离,B是位数,N是数量
dfs(-1,0);
sort(b,b+n,compare);
int begin = 1;
int j;
cout<<0;
for(int i = 0;i<n;i++){
if(begin==N) break;
for(j = 0;j<n;j++){
if(mark[j]&&i!=j){
int shuliang = 0;
for(int k = 0;k<B;k++){
if(b[j][k]!=b[i][k])
shuliang++;
}
if(shuliang<D) break;
}
}
if(j==n) {
mark[i] = true;
begin++;
if(begin!=1&&begin%10==1)
cout<<endl<<b[i].to_ulong();
else
cout<<" "<<b[i].to_ulong();
}
}
cout<<endl;
/*
for(int i=0;i<n;i++){
cout<<endl;
cout<<b[i].to_ulong()<<" "<<b[i]<<endl;
}*/
return 0;
}