Skip to main content

Gray Code

A Gray code is a list of all 2^n bit strings of length, where any two successive strings differ in exactly one bit (i.e., their Hamming distance is one). source 

The problem is, how to generate Gray Code for a given length n. 


When n = 2 , Gray Code : 

00 01 11 10


When n = 3, Gray Code :

000 001 011 010 110 111 101 100


000(0) position Gray code string 000 

001(1) -> 001 

010(2) -> 011 

011(3) -> 010

..... 

Key observation - 

For the K position, the Gray code string is S.  

if i and (i+1)-th bit of K is equal then i-th char of S will be  '0', otherwise, it will be '1'.  

Code : 

           int n; cin >> n;
    for(int i = 0; i < (1 << n); i++) {
        int value =  ( i ^ (i >> 1) ) ;
        string s = "";
        for(int j = 0; j < n; j++) {
            if( value & (1 << j) )s.push_back('1');
            else s.push_back('0');
        }
        reverse( s.begin(), s.end() );
        cout << s << ' ';
    }







 

Comments

Popular posts from this blog

Histogram - LOJ

It's a well-known problem and the well-known solution is using a stack. I tried to solve it by segment tree( iterative version for building tree ) and got TLE. Hope I can optimize the code.  TLE CODE 

Codeforces Global Round 6

Codeforces Global Round 6 A. Competitive Programmer According to the problem statement you are given some digits ( 0 - 9 ) , is it possible to make a number using all digits which is divisible by 60 ? To make a number from the digits which is divisible by 60, we need a zero and more than one even digits and digits sum must be divisible by 3. Code : B. Dice Tower According to the the picture given in the problem the sum of any two oppsite side of the dice is 7. Accept top dice , sum of all visible side pips in a dice is 21 - 7 = 14. We can make a tower , which all visible pips is equal to n , if n = 14 * d + 14 + pip n = 14 * D + pip where pip = { 1, 2, 3, 4, 5, 6 } Code :