USACO2.1 Hamming Codes(hamming)

        从0开始递增遍历全部天然数,直到取得n个知足要求的数为止。使用C++标准程序库bitset类型保存天然数a的二进制值,若是该二进制知足题目要求,则将a与其二进制对象保存进map<int,bitset<8> >中,而后继续递增a值遍历检验。感受算法复杂度挺高,可是全部测试例都是0秒经过,稍稍惊喜。ios

 

/*
ID:jzzlee1
PROG:hamming
LANG:C++
*/
#include<iostream>
#include<fstream>
#include<cmath>
#include<string>
#include<bitset>
#include<cstring>
#include<map>
using namespace std;
ifstream fin("hamming.in");
ofstream fout("hamming.out");
map<int,bitset<8> > map1;
map<int,bitset<8> >::iterator iter;
int n,b,d;
bool check(bitset<8> bt)		//检验该二进制对象是否知足与以前全部二进制对象汉明码距离至少为d
{
	int k=0;
	for(iter=map1.begin();iter!=map1.end();++iter)
	{
		k=0;
		for(int index=0;index!=8;++index)
		{
			if((iter->second)[index]!=bt[index])
				++k;
		}
		if(k<d)
			return 0;
	}
	return 1;
}
int main()
{
	//cin>>n>>b>>d;
	fin>>n>>b>>d;
	int a;
	
	int count=0;
	for(a=0,count=0;count!=n;++a)
	{
		bitset<8> bt(a);
		if(check(bt))
		{
			map1.insert(make_pair(a,bt));
			++count;
		}
	}
	int i;
	for(i=1,iter=map1.begin();iter!=map1.end();++i,++iter)		//输出
	{
		//注意输出格式,容易格式错
		//cout<<iter->first;
		fout<<iter->first;
		if(i%10==0)
			fout<<endl;
			//cout<<endl;
		else if(i!=n)
			fout<<" ";
			//cout<<" ";
		if(i==n&&i%10!=0)
			fout<<endl;
			//cout<<endl;
	}
	return 0;
}
相关文章
相关标签/搜索