Skip to content

Commit 55882f4

Browse files
author
Jim Gao
committed
Create hamming.cpp
1 parent 50617a2 commit 55882f4

File tree

1 file changed

+134
-0
lines changed

1 file changed

+134
-0
lines changed

USACO_Problems/hamming.cpp

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
/*
2+
ID: jim_yub1
3+
LANG: C++11
4+
TASK: hamming
5+
*/
6+
7+
#include <iostream>
8+
#include <algorithm>
9+
#include <string>
10+
#include <vector>
11+
12+
#define USACO
13+
#define FILEIN "hamming.in"
14+
#define FILEOUT "hamming.out"
15+
16+
using namespace std;
17+
18+
int reqLength, bits, minDistance;
19+
20+
char toLetter(int n){
21+
if (n < 10)
22+
return (char)(n + '0');
23+
24+
return (char)(n - 10 + 'A');
25+
}
26+
27+
string toBinary(unsigned int x)
28+
{
29+
std::string s;
30+
do
31+
{
32+
s.push_back('0' + (x & 1));
33+
} while (x >>= 1);
34+
reverse(s.begin(), s.end());
35+
return s;
36+
37+
}
38+
39+
string generateZero(int n){
40+
string r = "";
41+
for (int i = 0; i < n; i++) r = r + "0";
42+
return r;
43+
}
44+
45+
int diff(int num1, int num2){
46+
string s1 = toBinary(num1);
47+
string s2 = toBinary(num2);
48+
49+
int maxLength = max(s1.length(), s2.length());
50+
51+
if (s1.length() < s2.length()){
52+
s1 = generateZero(s2.length() - s1.length()) + s1;
53+
}
54+
else {
55+
s2 = generateZero(s1.length() - s2.length()) + s2;
56+
}
57+
58+
int diff = 0;
59+
60+
for (int i = 0; i < s1.length(); i++) if (s1[i] != s2[i]) diff += 1;
61+
62+
return diff;
63+
}
64+
65+
void generateSequence(vector<int> seq){
66+
67+
if (seq.size() == reqLength){
68+
int counter = 0;
69+
70+
for (int i = 0; i < seq.size(); i++){
71+
72+
int n = seq[i];
73+
74+
cout << n;
75+
counter++;
76+
77+
if (counter == 10 && i != seq.size() - 1){
78+
cout << endl;
79+
counter = 0;
80+
}
81+
else {
82+
if (i != seq.size() - 1)
83+
cout << " ";
84+
}
85+
}
86+
cout << endl;
87+
88+
exit(0);
89+
}
90+
91+
sort(seq.begin(), seq.end());
92+
93+
for (int i = seq[seq.size() - 1] + 1; i < pow(2, bits); i++){
94+
bool valid = true;
95+
96+
for (int n : seq)
97+
if (diff(n, i) < minDistance){
98+
valid = false;
99+
break;
100+
}
101+
102+
if (valid){
103+
vector<int> newSeq = seq;
104+
newSeq.push_back(i);
105+
106+
generateSequence(newSeq);
107+
108+
return;
109+
}
110+
}
111+
}
112+
113+
int main()
114+
{
115+
116+
#ifdef USACO
117+
freopen(FILEIN, "r", stdin);
118+
freopen(FILEOUT, "w", stdout);
119+
#endif
120+
121+
cin >> reqLength >> bits >> minDistance;
122+
123+
for (int i = 0; i < pow(2, bits) + 1; i++){
124+
vector<int> newSeq;
125+
newSeq.push_back(i);
126+
127+
128+
generateSequence(newSeq);
129+
}
130+
131+
132+
return 0;
133+
}
134+

0 commit comments

Comments
 (0)