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;
}
相關文章
相關標籤/搜索