格雷码定义: 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code)
格雷码的求解: 上一次求解到的Gray码, 按顺序给每一个都加上前缀0, 得到前一半,然后,将Gray码逆序,给每一个都加上前缀1就是答案。
例如:
n = 1
Gray: 0 1
n = 2
00 01 (顺序 0 1)
11 10 (逆序 1 0)
具体代码
#include <bits/stdc++.h> using namespace std; // Gray(n) = 前缀0 + 顺序Gray(n-1) 前缀1 + 逆序Gray(n-1) void getGrayCode(int arr[], int n) { if (n==1) { arr[1] = 0; arr[2] = 1; return; } // 获取 n-1 的格雷码 getGrayCode(arr, n-1); int k = 1<<(n-1); for(int i=k; i>0; i--) { // 逆袭加前缀 arr[2*k+1-i] = arr[i]+k; } } void printGrayCode(int arr[], const int n) { for(int i=1; i<=(1<<n); ++i) { //printf("%d\n", arr[i]); bitset<4> bit(arr[i]); cout<<bit<<" "; if ( i==(1<<(n-1)) ) // 一半时候进行换行 cout<<endl; } printf("\n"); } int main(void) { int n = 4; int *code = new int[1<<10]; getGrayCode(code, n); printGrayCode(code, n); return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。 http://blog.csdn.net/core__code
时间: 2024-10-22 03:44:02