海明码
题目描述
给出 N,B 和 D,要求找出 N 个由0或1组成的编码(1 <= N <= 64),每个编码有 B 位(1 <= B <= 8),使得两两编码之间至少有 D 个单位的“Hamming距离”(1 <= D <= 7)。“Hamming距离”是指对于两个编码,他们二进制表示法中的不同二进制位的数目。看下面的两个编码 0x554 和 0x234(0x554和0x234分别表示两个十六进制数):
0x554 = 0101 0101 0100
0x234 = 0010 0011 0100
不同位 xxx xx
因为有五个位不同,所以“Hamming距离”是 5。
分析:从0开始枚举,把每个数强制转换为二进制后判断即可。
代码
var
a:array[0..100,1..8] of longint;
ans:array[1..100] of longint;
b:array[1..8] of longint;
i,j,n,p,d,s:longint;
procedure change(x:longint);
var
i:longint;
begin
i:=0;
while x<>0 do
begin
inc(i);
b[i]:=x mod 2;
x:=x div 2;
end;
end;
function check:boolean;
var
i,j,k:longint;
begin
check:=true;
for i:=1 to s do
begin
k:=0;
for j:=1 to 8 do
if a[i,j]<>b[j] then inc(k);
if k<d then exit(false);
end;
end;
begin
readln(n,p,d);
while s<n do
begin
fillchar(b,sizeof(b),0);
change(i);
if check then
begin
inc(s);
for j:=1 to 8 do
a[s,j]:=b[j];
ans[s]:=i;
end;
inc(i);
end;
for i:=1 to n do
begin
write(ans[i],' ');
if i mod 10=0 then writeln;
end;
end.