USACO 2.1 海明码 Hamming Codes

来源:互联网 发布:简易电路图绘制软件 编辑:程序博客网 时间:2024/05/22 08:55

海明码

题目描述

给出 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.


0 0