题意:按照从小至大的顺序输出N个B位的数,每个数与其他的数之间的Hamming距离至少为D。如果有多解,你的程序要输出这样的解:假如把它化为2^B进制数,它的值要最小。
解题思路:
- 读入输入
- 建立一个数组用来保存满足条件的序列,首先加入0这个数
- 从1开始遍历到2^B
- 对每个遍历到的数,检查其与数组中已经存在的所有数的Hamming距离(两个数XOR的结果中1的个数即为Hamming距离),满足条件则将其加入数组
- 遍历过程中,一旦数组中加入的数量达到N,则结束遍历
- 输出结果
代码:
/*
ID: zc.rene1
LANG: C
PROG: hamming
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int pow2(int num)
{
int ret = 1;
while (num > 0)
{
ret *= 2;
num--;
}
return ret;
}
int GetDistance(int a, int b)
{
int distance = 0;
a = a^b;
while (a > 0)
{
distance += (a&1);
a >>= 1;
}
return distance;
}
int Check(int in, int *arr, int index, int distance)
{
int ret = 1, i;
for (i=0; i<index; i++)
{
if (GetDistance(in, arr[i]) < distance)
{
ret = 0;
break;
}
}
return ret;
}
int main(void)
{
FILE *fin, *fout;
int N, B, D;
int *arr;
int i, MAX, index;
fin = fopen("hamming.in", "r");
fout = fopen("hamming.out", "w");
fscanf(fin, "%d %d %d", &N, &B, &D);
arr = (int*)malloc(N*sizeof(int));
memset(arr, 0, N*sizeof(int));
index = 1;
MAX = pow2(B);
for (i=1; i<=MAX; i++)
{
if (Check(i, arr, index, D) == 1)
{
arr[index++] = i;
if (index == N)
{
break;
}
}
}
for (i=0; i<index-1; i++)
{
if (i%10 != 9)
{
fprintf(fout, "%d ", arr[i]);
}
else
{
fprintf(fout, "%d\n", arr[i]);
}
}
fprintf(fout, "%d\n", arr[i]);
return 0;
}