| input | output |
|---|---|
0 1 0 1 1 0 1 |
0 1 0 0 1 0 1 |
1 1 1 1 1 1 1 |
1 1 1 1 1 1 1 |
这样的题目就是考理解题目的能力了。
因为数据十分小,所以使用上面方法都不会超时的,只要答案对就可以了。
所以遇上这样的题目就暴力吧。
#include <iostream>
using namespace std;
void countHammingCode(int B[])
{
B[4] = (B[1] + B[2] + B[3])%2;
B[5] = (B[0] + B[2] + B[3])%2;
B[6] = (B[0] + B[1] + B[3])%2;
}
void HammingCode()
{
int A[7], B[7];
for (int i = 0; i < 7; i++)
{
cin>>A[i];
B[i] = A[i];
}
bool ok = false;
for (int k = -1; k < 4; k++)
{
if (-1 != k) B[k] = !B[k];
countHammingCode(B);
ok = true;
for (int i = 4; i < 7; i++)
{
if (A[i] != B[i]) ok = false;
}
if (ok)
{
for (int i = 0; i < 7; i++)
{
cout<<B[i]<<‘ ‘;
}
break;
}
if (-1 != k) B[k] = !B[k];
}
if (!ok)
{
countHammingCode(B);
for (int i = 4; i < 7; i++)
{
A[i] = !A[i];
ok = true;
for (int j = 4; j < 7; j++)
{
if (A[j] != B[j]) ok = false;
}
if (ok)
{
for (int j = 0; j < 7; j++)
{
cout<<B[j]<<‘ ‘;
}
break;
}
A[i] = !A[i];
}
}
}
int main()
{
HammingCode();
return 0;
}
觉得上面代码不够简洁的,可以参考下面代码:
void mainHammingCode()
{
int i,m[8];
for(i=1; i<8; i++) scanf("%d", &m[i]);
for(i=1; i<9; i++)
{
if( (m[2]+m[3]+m[4])%2 == m[5] &&
(m[1]+m[3]+m[4])%2 == m[6] &&
(m[1]+m[2]+m[4])%2 == m[7]) break;
m[i]=(!m[i]);
m[i-1]=(!m[i-1]);
}
for(i=1;i<8;i++) printf("%d ",m[i]);
}
Timus 1792. Hamming Code 题解,布布扣,bubuko.com
原文:http://blog.csdn.net/kenden23/article/details/24535723