问题:
递归打印出N位格雷码(相邻两个编码只有一位数字不同):
      问题化归为:现有前N位的格雷码,如何构造N+1位的格雷码?

解决方法:采用递归构造格雷码集和。

  递归出口:n = 1; 此时格雷码{0,1}
  N+1:N+1位的格雷码 = N位格雷码(顺序)+0,N位格雷码逆序+1(N位的格雷码顺序最后一个编码与逆序第一个编码是同一个编码,在此可以分别加0,1两个编码依旧只有一位不同)

public class GC{
int[][] G;//
int N;
int SIZE;
GC(int N){
this.N = N;
SIZE =(int)Math.pow(2,N);
G = createG(G,N);
}
public int[][] createG(int[][] g,int N){//由原有的格雷码集合g造新的格雷码集G 递归构造
if(N <1){
return null;
}
if(N == 1){
g = new int[2][1];
g[0][0] = 0;
g[1][0] = 1;
return g;
}
g = createG(g,N-1);
SIZE =(int)Math.pow(2,N);
G = new int[SIZE][N];
int n =N-1;//原格雷码的位数
for(int i =0;i<SIZE/2;i++){//顺序
for(int j=0;j<n;j++){
G[i][j] = g[i][j];
}
G[i][N-1] = 0;
}
for(int i = SIZE/2;i<SIZE;i++){//逆序
for(int j=0;j<n;j++){
G[i][j] = g[SIZE-1-i][j];
}
G[i][N-1] = 1;
}
return G;
}
public void show(){
for(int i =0;i<SIZE;i++){
for(int j=0;j<N;j++){
System.out.print(G[i][j]+" ");
}
System.out.println();
}
}
public static void main(String[] args){
int N = new Integer(args[0]).intValue();
GC G= new GC(N);
G.show();
return;
}
}

构造N位格雷码(递归,面向对象)的更多相关文章

  1. 求解n位格雷码

    /************************************************************************* > File Name: Gray.cpp ...

  2. gray code 格雷码 递归

    格雷码 the n-1 bit code, with 0 prepended to each word, followd by the n-1 bit code in reverse order, w ...

  3. 构建n位元的格雷码

    二进制格雷码的生成 1.什么是格雷码 Gray Code是一个数列集合,每个数使用二进制来表示,假设使用n位元来表示每个数字,那么任两个数之间只有一个位元值不同.log2(16)=4 例如: 生成4位 ...

  4. C语言输出格雷码

    格雷码是以n位的二进制来表示数. 与普通的二进制表示不同的是,它要求相邻两个数字只能有1个数位不同. 首尾两个数字也要求只有1位之差. 有很多算法来生成格雷码.以下是较常见的一种: 从编码全0开始生成 ...

  5. Gray Code - 格雷码

    基本概念 格雷码是一种准权码,具有一种反射特性和循环特性的单步自补码,它的循环.单步特性消除了随机取数时出现重大误差的可能,它的反射.自补特性使得求反非常方便.格雷码属于可靠性编码,是一种错误最小化的 ...

  6. LeetCode 格雷码序列的生成

    问题概述:在一组数的编码中,若随意两个相邻的代码仅仅有一位二进制数不同.则称这样的编码为格雷码. 2位数的格雷码序列:00 : 001 : 111 : 310 : 2找规律:假设要求n位的格雷码,先要 ...

  7. 2019CSP day1t1 格雷码

    题目描述 通常,人们习惯将所有 \(n\) 位二进制串按照字典序排列,例如所有 \(2\) 位二进制串按字典序从小到大排列为:\(00,01,11,10\). 格雷码(\(Gray Code\))是一 ...

  8. [CSP-S 2019]格雷码

    [CSP-S 2019]格雷码 题目大意: 格雷码(Gray Code)是一种特殊的 \(n\) 位二进制串排列法,它要求相邻的两个二进制串间恰好有一位不同,特别地,第一个串与最后一个串也算作相邻. ...

  9. 【解题报告】CSP2019-S D1T1 格雷码

    题目链接:https://www.luogu.org/problem/P5657 话说这道题怎么是道橙题啊. 基本思路 因为n位格雷码的前2n-1位就是n-1位格雷码前面加了一位‘0’,所以可以把它们 ...

随机推荐

  1. mysql myisam转innodb的2种方法

      mysql myisam转innodb的2种方法 mysql中的myisam和innodb有什么区别.一个好比便利店,一个好比大型购物中心,他们是为了适应不同的场合而存在的.当流量比较小,我们可以 ...

  2. C#动态设置匿名类型对象的属性

    用C#写WPF程序, 实现功能的过程中碰到一个需求: 动态设置对象的属性,属性名称是未知的,在运行时才能确定. 本来这种需求可以用 Dictionary<string, object> 实 ...

  3. 如何修改nexus的端口号

    1. Maven仓库:放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR,这节省了磁盘资源. 简言之,Maven仓库能帮助 ...

  4. Servlet--ServletInputStream类,ServletOutputStream类

    ServletInputStream类 定义 public abstract class ServletInputStream extends InputStream 这个类定义了一个用来读取客户端的 ...

  5. linkin大话设计模式--门面模式

    linkin大话设计模式--门面模式 随着系统的不断改进和开发,他们会变得越来越复杂,系统会生成大量的类,这使得程序的流程更加难以理解.门面模式可以为这些类提供一个简易的接口,从而简化访问这些类的复杂 ...

  6. oracle 查看最大连接数与当前连接数

    select count(*) from v$process --当前的连接数 select value from v$parameter where name = 'processes' --数据库 ...

  7. zabbix-proxy搭建

    环境: 因为公司需要监控远程客户机,但server端无法主动连接agent端,客户端可以连接公司ip 公司有固定ip,可以开放某个端口给zabbixserver,客户机agent端可以主动通过外网连接 ...

  8. TCP粘包和拆包问题

    问题产生 一个完整的业务可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和封包问题. 下面可以看一张图,是客户端向服务端发送包: 1. 第一种情况 ...

  9. mysql添加用户和密码

    首先要声明一下:一般情况下,修改MySQL密码,授权,是需要有mysql里的root权限的.   注:本操作是在WIN命令提示符下,phpMyAdmin同样适用.     用户:phplamp  用户 ...

  10. TCP/IP参考模型

    1.简介 什么是TCP/IP参考模型? TCP/IP模型是网络通信模型的一种.网络通信模型还包括OSI,旨在使各种计算机在世界范围内互连为网络.其中有OSI为七层模型.TCP/IP为四层模型,现在大部 ...