zoukankan      html  css  js  c++  java
  • (算法)格雷码

    题目:

    The gray code is a binary numeral system where two successive values differ in only one bit.

    Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.

    For example, given n = 2, return [0,1,3,2]. Its gray code sequence is:

    00 - 0
    01 - 1
    11 - 3
    10 - 2
    

    Note:
    For a given n, a gray code sequence is not uniquely defined.

    For example, [0,2,3,1] is also a valid gray code sequence according to the above definition.

    For now, the judge is able to judge based on one instance of gray code sequence. Sorry about that.

    n=3时,GrayCode是:

    000
    001
    011
    010
    110
    111
    101
    100

    思路:

    n位的格雷码可以从n-1位的格雷码得到,

    n位的格雷码组成:

    1、n-1位的格雷码

    2、n-1位的格雷码的逆序+(1<<(n-1))

    如下图:

    代码:

    #include<iostream>
    #include<vector>
    
    using namespace std;
    
    // Non_Recursive
    vector<int> GrayCode_1(int n){
        vector<int> result;
        result.push_back(0);
    
        for(int i=0;i<n;i++){
            int len=result.size();
            int c=1<<i;
            for(int j=len-1;j>=0;j--)
                result.push_back(result[j]+c);
        }
    
        return result;
    }
    
    // Recursive
    void GrayCode_2(vector<int> &result,int n){
        if(n==0){
            result.push_back(0);
            return;
        }
    
        GrayCode_2(result,n-1);
        int len=result.size();
    
        for(int i=len-1;i>=0;i--)
            result.push_back(result[i]+(1<<(n-1)));
    
    }
    
    int main(){
        int n=4;
        vector<int> result1;
        vector<int> result2;
    
        result1=GrayCode_1(n);
        GrayCode_2(result2,n);
    
        for(int i=0;i<result1.size();i++)
            cout<<result1[i]<<" ";
        cout<<endl;
    
        for(int i=0;i<result2.size();i++)
            cout<<result2[i]<<" ";
        cout<<endl;
    
        return 0;
    }


  • 相关阅读:
    【转】C#连接mysql
    【转】深度优先算法
    【转】mysql安装
    win7NVIDIA显卡驱动升级时卡住
    【转】win7系统删除桌面IE图标
    双系统删掉一个后,所在分区无法格式化
    SQL各种JOIN
    C# 反射
    【转】C#强制转换和显式转换
    SQL Server 去除表中字段空格
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4789862.html
Copyright © 2011-2022 走看看