BZOJ1081超级格雷码

Posted G . H . O . S . T . R . E . A

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ1081超级格雷码相关的知识,希望对你有一定的参考价值。

著名的格雷码是指2n个不同n位二进制数(即0~2n-1,不足n位在前补零)的一个排列,这个排列满足相邻的两
个二进制数的n位数字中最多只有一个数字不同(例如003和001就有一个数位不同,而003和030有两个数位不同,
不符合条件)。例如n=2时,(00,01,11,10)就是一个满足条件的格雷码。 所谓超级格雷码就是指Bn个不同的n位B
进制数的排列满足上面的条件。 任务:给出n和B(2≤B≤36, 1≤Bn≤65535),求一个满足条件的格雷码。对于
大于9的数位用A~Z表示(10~35)。

 

题解:

身为一道构造题竟然没有SPJ,辣鸡BZOJ。

给每一位设置一个增减标记,1表示增-1表示减

求下一个格雷码时,从第一位开始访问,若还能根据其增减标记改变,则增1或减1,并输出答案;若不能,则改变其增减标记,去访问下一位。

辣鸡BZ,数据与给出样例不符。

 

代码:

const
  f:array[0..1]of longint=(1,-1);
var
  i,j,k,l,n,nn,m:longint;
  a,b:array[0..100]of longint;
function x(a:longint):char;
begin
  if a<10 then exit(chr(a+ord(0)));
  exit(chr(a-10+ord(A)));
end;
begin
  readln(m,n);
  for i:=1 to m do write(0); writeln;
  nn:=1;
  for i:=1 to m do nn:=nn*n; nn:=nn-1;
  for i:=1 to nn do
  begin
    j:=m;
    while(a[j]+f[b[j]]>n-1)or(a[j]+f[b[j]]<0)do
    begin b[j]:=1-b[j]; dec(j); end;
    a[j]:=a[j]+f[b[j]];
    for j:=m downto 1 do write(x(a[j]));
    writeln;
  end;
end.

以上是关于BZOJ1081超级格雷码的主要内容,如果未能解决你的问题,请参考以下文章

bzoj2002 弹飞绵羊 LCT

超级有用的9个PHP代码片段

什么是超级立方体,HyperCube

bzoj3731: Gty的超级妹子树

BZOJ 2243 染色

BZOJ1191: [HNOI2006]超级英雄Hero