(算法)格雷码

题目:

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;
}

 



    原文作者:AndyJee
    原文地址: https://www.cnblogs.com/AndyJee/p/4789862.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞